Джексон регистрирует пользовательский сериализатор json

Это мой пользовательский сериализатор JSON, и я пытаюсь зарегистрировать его как модуль. Вот что у меня есть до сих пор.

public class MaptoListSerializer extends JsonSerializer<Map<String, Car<?, ?>>> {

        @Override
        public void serialize(Map<String, Car<?, ?>> value, JsonGenerator gen, SerializerProvider serializers)throws IOException, JsonProcessingException {
             gen.writeObject(value.values());
        }
}

Вот мой класс модуля, который я создал (Кажется, я не могу добавить сериализатор).

public class CustomModule extends SimpleModule {

private static final long serialVersionUID = -9105685985325373621L;

public CustomModule() {
    super("CustomModule");
}

@Override
public void setupModule(SetupContext context) {
    SimpleSerializers serializers = new SimpleSerializers();

    //THIS DOESN'T WORK . HOW DO I ADD THE SERIALIZER?
    serializers.addSerializer(HashMap.class, new MaptoListSerializer ());

    context.addSerializers(serializers);
 }
}

Вот как он использовал средство сопоставления объектов (Это работает)

mapper = new ObjectMapper();
mapper.registerModule(new CustomModule());

person user3100209    schedule 22.11.2017    source источник


Ответы (1)


Это проблема из-за использования HashMap, необработанного типа, в то время как в этом случае требуются дженерики. Вы можете решить эту проблему, создав собственный сериализатор на основе StdSerializer, как рекомендовано в документации. Оставьте метод serialize таким, какой он есть, но определите сериализатор с помощью такого конструктора:

class MaptoListSerializer extends StdSerializer<Map<String, Car<?, ?>>> {
    MaptoListSerializer(JavaType type) {
        super(type);
    }

Затем к важному биту, где вы создаете соответствующий JavaType и передаете его этому конструктору:

MapType type = context.getTypeFactory()
    .constructMapType(HashMap.class, String.class, Car.class);
serializers.addSerializer(new MaptoListSerializer(type));

context.addSerializers(serializers);
person Manos Nikolaidis    schedule 23.11.2017
comment
как бы вы сделали десериализатор? Я сделал то же самое, что и расширенный StdDeserializer.... но не уверен, что теперь можно добавить его в Deserizlier... - person user3100209; 25.11.2017
comment
Ваш пользовательский сериализатор создает массив JSON из Car значений Map. Вы хотите десериализовать это в List<Car> я полагаю? В этом случае мои подсказки: JavaType type = context.constructCollectionType(List.class, Car.class); и deserializers.addDeserializer(List.class, new MaptoListDeserializer(type)); - person Manos Nikolaidis; 26.11.2017
comment
извините, это будет ListToMapDeserializer - person user3100209; 28.11.2017