ジャクソン:JSONへのカスタムコレクションシリアル化
質問
私は、2番目のクラスのMyClassの要素のコレクションであるプロパティでクラスMyrootclassをjson-Serializeしようとしています。
public class MyRootClass {
private List<MyInterface> list = new ArrayList<MyInterface>();
// getter / setter
}
public class MyClass implements MyInterface {
private String value = "test";
// getter / setter
}
次のコード:
MyRootClass root = new MyRootClass();
root.getList().add(new MyClass());
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(System.out, root);
このJSON出力を生成します:
{"list": [ {"value":"test"} ] }
私が必要とするものの代わりに、コレクション内のすべてのオブジェクトが名前でシリアル化されました:
{"list": [ {"myclass": {"value":"test"}} ] }
ジャクソンを使用してそれを達成する方法はありますか?カスタムシリアナーを書くことを考えましたが、オブジェクトのコレクションに関連するものは見つかりませんでした。
解決
それはあなたが名前で達成したいことに依存します。しかし、はい、これは「myclass」をタイプ情報を含めたい場合に行うことができます(または、それが使用されたかのように振る舞うことができます。ジャクソンを使用してそれが実際に重要ではない場合は)。
もしそうなら、あなたは私のインターフェイスに注釈を付けます:
@JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT)
とmyclass:
@JsonTypeName("myclass")
(それを定義しない場合、デフォルト名はクラスの資格のない名前になります)
@JsonTypeInfo
上記は、(Javaクラス名、またはカスタムメソッドの代わりに)使用するタイプ名を定義し、ラッパーオブジェクトを使用して包含が行われます(代替はラッパーアレイとプロパティです)
そのため、予想される出力が表示されます。
他のヒント
あなたが望むのは、出力にクラスの名前を含めることです。これは、JSONシリアイザーの動作方法ではありません。フィールド名のみが含まれます。
あなたができることは、別のクラスを紹介することです。
class MyClass implements MyInterface {
private MyOtherClass myclass;
}
class MyOtherClass {
private String value = "test";
}
次のようなヘルパーオブジェクトを使用できます。
public static class MyObject {
public int i;
public MyObject(int i) { this.i = i; }
public MyObject() {}
}
@JsonDeserialize(contentAs=MyObject.class)
public static class MyHelperClass extends ArrayList<MyObject> {
}
@Test
public void testCollection() throws JsonGenerationException, JsonMappingException, IOException {
final Collection<MyObject> l = new ArrayList<MyObject>();
l.add(new MyObject(1));
l.add(new MyObject(2));
l.add(new MyObject(3));
final ObjectMapper mapper = new ObjectMapper();
final String s = mapper.writeValueAsString(l);
final Collection<MyObject> back = mapper.readValue(s, MyHelperClass.class);
}
所属していません StackOverflow