6

Jackson JSON Processor ライブラリの奇妙な動作を見つけました。これが意図的なものなのかバグなのか、興味があります。以下のコードをご覧ください。

@JsonTypeInfo(use = Id.NAME)
public class Nut {}

…</p>

ObjectMapper mapper = new ObjectMapper();

Nut nut = new Nut();
Object object = new Nut();
Nut[] nuts = new Nut[] { new Nut() };
Object[] objects = new Object[] { new Nut() };

System.out.println(mapper.writeValueAsString(nut));
System.out.println(mapper.writeValueAsString(object));
System.out.println(mapper.writeValueAsString(nuts));
System.out.println(mapper.writeValueAsString(objects));

出力:

{"@type":"Nut"}
{"@type":"Nut"}
[{"@type":"Nut"}]
[{}]

私が期待する(そして欲しい)のは次のとおりです。

{"@type":"Nut"}
{"@type":"Nut"}
[{"@type":"Nut"}]
[{"@type":"Nut"}] // <<< type information included

何か見落としがありますか、それともバグレポートを提出する必要がありますか?

4

1 に答える 1

4

これは予想される動作です。シリアル化のためにオブジェクトグラフをトラバースする場合、Jacksonは、含めるタイプ情報を決定するときに、宣言されたタイプのオブジェクトを使用します。の要素objectsはタイプObjectを宣言していますが、Jacksonにタイプ情報を含めるように指示していません。

writeValueAsStringジャクソンは、メソッド引数の型がObject;であるため、の最上位引数の実行時型のみを調べます。Javaでは、メソッドに引数として渡されたオブジェクトの宣言された型を知ることはできません(型消去のおかげでジェネリックスでも)ので、最初の2つの例(writeValueAsString(nut)そしてwriteValueAsString(object)事実上同一です)。

詳細はこちら: http: //jackson-users.ning.com/forum/topics/mapper-not-include-type-in​​formation-when-serializing-object-why

于 2013-01-29T18:20:07.243 に答える