Jackson ObjectMapper设置了没有注释的JsonFormat.Shape.ARRAY

时间:2017-05-29 15:32:30

标签: java json spring jackson objectmapper

我需要使用两个jackson 2对象映射器。 两个映射器都使用同一组类。 在第一个我需要使用标准序列化。 在第二个我想为所有类使用ARRAY形状类型(见https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonFormat.Shape.html#ARRAY)。

但我想为我的第二个ObjectMapper全局设置此功能。像mapper.setShape(...)

之类的东西

怎么做?

UPD:

我找到了一种覆盖该类配置的方法:

mapper.configOverride(MyClass.class)
   .setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.ARRAY));

所以我可以使用Reflection API更改所有类。

我覆盖全局设置令人尴尬,但我不能直接设置它。

1 个答案:

答案 0 :(得分:2)

由于@JsonFormat注释适用于字段,因此您无法在全局级别将其设置为Shape.Array。这意味着所有字段都将被序列化并反序列化为数组值(想象一下如果一个字段已经是一个列表,在这种情况下,它将被包装到另一个列表中,这是我们可能不需要的。)

但是,您可以为类型(将值转换为数组)编写自己的serializer并在ObjectMapper中对其进行配置,例如:

class CustomDeserializer extends JsonSerializer<String>{

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers)
            throws IOException, JsonProcessingException {
        gen.writeStartArray();
        gen.writeString(value);
        gen.writeEndArray();
    }
}

并将其配置为ObjectMaper实例,例如:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(String.class, new CustomDeserializer());
mapper.registerModule(module);