2013-04-25 3 views
2

Я использую библиотеку Джексона для записи пользовательских сериализаторов и регистрирую их внутри пользовательского ObjectMapper. Однако я также хочу изменить сериализацию по умолчанию, чтобы просто выводить строковое представление объекта, когда более конкретная пользовательская сериализация не была записана.Изменение поведения сериализации по умолчанию в Jackson

Например, я написал собственные сериализаторы для классов «Карта» и «Ввод» в дополнение к сериализатору по умолчанию. Затем модуль сериализации в моем пользовательском ObjectMapper может выглядеть следующим образом:

SimpleModule module = new SimpleModule("module", new Version(0, 1, 0, "alpha", null, null)); 
module.addSerializer(Entry.class, new EntryJsonSerializer()); 
module.addSerializer(Map.class, new MapJsonSerializer()); 
module.addSerializer(Object.class, new DefaultJsonSerializer()); 
this.registerModule(module); 

Однако я нахожу, что модуль будет использовать DefaultJsonSerializer сериализовать Карта и вступление объектов (поскольку они также объект объектов).

Как изменить поведение сериализации по умолчанию, в то время как объекты Entry и Map сериализуются по назначению?

ответ

1

Я получил вокруг проблемы, написав один сериалайзер и используя ряд, если заявления для реализации приоритетов:

public final class UnifiedJsonSerializer extends JsonSerializer<Object> { 
    @Override 
    public void serialize(Object object, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException { 
     if (object instanceof Entry) { 
      // Entry serialization code 
     } else if (object instanceof Map) { 
      // Map serialization code 
     } else { 
      // default serialization code 
     } 
} 
1

Проблема, вероятно, в том, что фактический тип значений (например, String) используется для размещения сериализаторов.

Одним из решений было бы зарегистрировать сериализаторы для типов значений, если вы их знаете.

В качестве альтернативы вы можете принудительно использовать статическую типизацию; это сделало бы использование serializer lookup используемым объявленным (статическим) типом, а не фактическим типом времени выполнения. Это может быть сделано с:

objectMapper.enable(MapperFeature.USE_STATIC_TYPING); 
+0

спасибо за ответ. Принудительное статическое типирование не изменило результат. Я не уверен, что вы подразумеваете под «регистраторами сериализаторов для типов значений», пример был бы полезен. – dug

+0

Я имею в виду, что вы не можете указать «использовать это для любого java.lang.Object», который будет использоваться для всего - вам нужно сделать «addSerializer» для фактических типов, которые вы хотите переопределить. Или, если вы не заботитесь о каких-либо стандартизированных сериализаторах, предлагаемых Jackson, вы можете просто обрабатывать жесткий код (согласно вашему ответу). – StaxMan

Смежные вопросы