2017-05-29 20 views
0

2つのjackson 2オブジェクトマッパーを使用する必要があります。 両方のマッパーは、同じクラスのセットで動作します。 最初に標準のシリアル化を使用する必要があります。 2番目は、すべてのクラスにARRAYシェイプタイプを使用したいと考えています(https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonFormat.Shape.html#ARRAY参照)。Jackson ObjectMapperは注釈なしでJsonFormat.Shape.ARRAYを設定します

しかし、私は2番目の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); 
関連する問題