2016-06-28 51 views
0

私はいくつかの方法を試しましたjacksonシリアライザカバー文字列ヌルから空文字列( "")とオブジェクトのヌルがnullのままです

1.createカスタムJsonSerializer、および上書きSerializeメソッド

@Override 
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 
    gen.writeString(""); 
} 

と、このようなNullValueSerializerにJsonSerializerを、設定:

objectMapper.getSerializerProvider().setNullValueSerializer(new NullStringSerializer()); 

しかし、我々はヌルからクラスタイプを取得することはできません。すべてのnullは ""に変換され、オブジェクトが含まれます。

2.IfはSerializeメソッドで使用SimpleModule

SimpleModule simpleModule = new SimpleModule("StringModule", Version.unknownVersion()); 
simpleModule.addSerializer(Object.class, new NullStringSerializer()); 
objectMapper.registerModule(simpleModule); 

は、PARAM値はnullである任意の特性を有していません。ジャクソン2.6.0のresouceコードから

、MapSerializer.java方法serializeFieldsを見つける(私のオブジェクトがマップである)ライン:545

for (Map.Entry<?,?> entry : value.entrySet()) { 
      Object valueElem = entry.getValue(); 
      // First, serialize key 
      Object keyElem = entry.getKey(); 
      if (keyElem == null) { 
       provider.findNullKeySerializer(_keyType, _property).serialize(null, gen, provider); 
      } else { 
       // One twist: is entry ignorable? If so, skip 
       if (ignored != null && ignored.contains(keyElem)) continue; 
       keySerializer.serialize(keyElem, gen, provider); 
      } 

      // And then value 
      if (valueElem == null) { 
       provider.defaultSerializeNull(gen); 
      } else {...} 
} 

valueElemが提供するだけのためにそれをひそか、nullでありますヌル。 と私に戦略を変更するためのインターフェイスがありません。

私はMapSerializerをオーバーライドできますが、新しいMapSerializerを工場に設定する方法はわかりません。

解決策はありますか?

あなたのお役に立てる、ありがとうございます!

答えて

0

解を見つける: 抽象クラスSerializerProviderには、findNullValueSerializerというメソッドがあります。このメソッドは、シリアライザが指定されたプロパティのNull値をシリアル化するために呼び出されます。 我々はSerializerProvider#findNullValueSerializerとマッチStringクラスオーバーライドすることができます。

@Override 
public JsonSerializer<Object> findNullValueSerializer(BeanProperty property) throws JsonMappingException { 
    if (property.getType().getRawClass().equals(String.class)) { 
     return EmptyStringSerializer.INSTANCE; 
    } else { 
     return super.findNullValueSerializer(property); 
    } 
} 

をして、私たちのObjectMapperインスタンスにSerializerProviderを設定します。

が完了しました。

関連する問題