2012-07-19 11 views
6

私は以下の問題に直面しています。Jacksonとのルートプリミティブオブジェクトのシリアライズ

objectMapper = new ObjectMapper(); 

StringWriter w = new StringWriter(); 
objectMapper.writeValue(w, Integer.valueOf(10)); 
System.out.println(w.toString()); 

は出力として10生成:ジャクソン・シリアライザは、シリアル化のための原始的なラップを渡されると、このプリミティブは、例えば、あるとしてシリアライズされます。しかし、10は有効なJSON(jsonlintによる)であり、大括弧([10]、単一要素配列になるように)または中括弧({value:10}、ダミープロパティを持つオブジェクトになる) 。問題は数字に影響します。java.lang.Stringjava.util.Date、...

私の質問は次のとおりです。 Jacksonが常に有効なJSONを生成してはいけませんか?

私は、SerializationConfig.Feature.WRAP_ROOT_VALUEを有効にしてジャクソンの行動を分析しました。期待通りに動作しません。プリミティブは現在有効なJSON({"Integer":10})にシリアル化されていますが、「通常の」Java Beansもラップされていますが、これは望ましくありません({"field":value, ...}ではなく{"MyBean":{"field":value, ...}})。

カスタムシリアライザを使用して、ジャクソンをカスタマイズする方法をアドバイスできますか。難しいのは、ラッププリミティブラッパー(ラップする必要がある)とビーンプリミティブプロパティ(ラップする必要はありません)を区別する必要があることです。

Spring MVCのメッセージコンバータとしてJacksonシリアライザが使用されていますが、プリミティブのシリアル化をインターセプトするフックを書くのは簡単です(Jacksonを呼び出さずに、必要なときに単に"[" + String.toString(obj) + "]"を返します)。 )。だから私は調整されたジャクソンのソリューションを好むだろう。

+0

https://github.com/FasterXML/jackson-databind/issuesで強化リクエストを記録することをおすすめします。 –

答えて

3

最後にカスタム・シリアライザ

import java.io.IOException; 

import org.codehaus.jackson.JsonGenerationException; 
import org.codehaus.jackson.JsonGenerator; 
import org.codehaus.jackson.map.SerializerProvider; 
import org.codehaus.jackson.map.ser.std.ScalarSerializerBase; 

public class NumberSerializer extends ScalarSerializerBase<Number> { 

    protected NumberSerializer() { 
     super(Number.class); 
    } 

    @Override 
    public void serialize(Number value, JsonGenerator jgen, SerializerProvider provider) throws IOException, 
       JsonGenerationException { 
     if (jgen.getOutputContext().inRoot()) { 
      jgen.writeStartArray(); 
      jgen.writeNumber(value.longValue()); 
      jgen.writeEndArray(); 
     } 
     else { 
      jgen.writeNumber(value.longValue()); 
     } 
    } 
} 

は私のために仕事をしてくれました。シリアライザはモジュールとして登録できます( here参照)。

このseriazlierを使用するときに注意してください:すべてのプリミティブを1つの要素だけでプリミティブ配列に変換するので、A != desrialize(serialize(A))Aがプリミティブであるという意味で反射原理を破ります。

関連する問題