7

我正在尝试使用一个属性对类 MyRootClass 进行 json 序列化,该属性是第二类 MyClass 的元素集合:

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 类名或自定义方法),并且包含是通过使用包装器对象完成的(替代方案是包装器数组和 as-property)

所以你应该看到预期的输出。

于 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 回答