7

2番目のクラスMyClassの要素のコレクションであるプロパティを使用してクラスMyRootClassをjsonシリアル化しようとしています。

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"}} ] }

ジャクソンを使用してそれを達成する方法はありますか?カスタムシリアライザーを作成することを考えましたが、オブジェクトのコレクションに関連するものは見つかりませんでした。

4

3 に答える 3

7

それはあなたが名前で何を達成したいかによります。ただし、これは、タイプ情報である「myclass」をここに含める場合に実行できます(または、使用されたかのように動作できます。Jacksonを使用して逆シリアル化しない場合は、実際には重要ではありません)。

その場合、MyInterfaceに注釈を付けます。

@JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT)

およびMyClass:

@JsonTypeName("myclass")

(これを定義しない場合、デフォルト名はクラスの非修飾名になります)

@JsonTypeInfo上記は、タイプ名が(Javaクラス名またはカスタムメソッドの代わりに)使用されることを定義し、インクルードはラッパーオブジェクトを使用して行われます(代替はラッパー配列およびプロパティとして)

したがって、期待される出力が表示されます。

于 2010-10-18T02:30:00.467 に答える
1

必要なのは、出力にクラスの名前を含めることです。これは、jsonシリアライザーの動作ではありません。フィールド名のみが含まれます。

あなたにできることは、別のクラスを紹介することです。

class MyClass implements MyInterface {
    private MyOtherClass myclass;
}

class MyOtherClass {
    private String value = "test";
}
于 2010-10-17T17:24:53.690 に答える
1

次のようなヘルパーオブジェクトを使用できます。

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);

}
于 2011-08-18T10:05:27.293 に答える