2017-05-29 120 views
0

我需要使用兩個傑克遜2對象映射器。 這兩個映射器都使用同一組類。 在第一個我需要使用標準序列化。 在第二我想使用ARRAY形狀類型的所有類(見https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonFormat.Shape.html#ARRAY)。傑克遜ObjectMapper設置JsonFormat.Shape.ARRAY沒有註釋

但我想全局設置這個功能爲我的第二個ObjectMapper。類似於mapper.setShape(...)

如何做到這一點?

UPD:

我找到了一種方法來覆蓋配置爲類:

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

這樣我就可以使用反射API的所有我的課改變。

令人尷尬的是,我重寫了全局設置,但我無法直接設置它。

回答

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);