私は以下の問題に直面しています。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.String
、java.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) + "]"
を返します)。 )。だから私は調整されたジャクソンのソリューションを好むだろう。
https://github.com/FasterXML/jackson-databind/issuesで強化リクエストを記録することをおすすめします。 –