代码之家  ›  专栏  ›  技术社区  ›  Guido

Jackson:自定义集合序列化到JSON

  •  7
  • Guido  · 技术社区  · 14 年前

    我正试图用属性json序列化一个类MyRootClass,该属性是第二个类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"}} ] }
    

    有没有办法用杰克逊来实现它?我想写一个定制的序列化程序,但是我没有找到任何与对象集合相关的东西。

    3 回复  |  直到 14 年前
        1
  •  7
  •   Bozho    14 年前

    这取决于您到底想用name实现什么;但是是的,如果您想在这里包含“myclass”类型信息(或者可以像使用它一样操作;如果您不使用Jackson来反序列化它并不重要),那么可以这样做。

    如果是,您将注释MyInterface:

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

    我的班级有:

    @JsonTypeName("myclass")
    

    (如果不定义,默认名称将是类的非限定名称)

    @JsonTypeInfo

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

        2
  •  1
  •   Guido    14 年前

    您需要的是在输出中包含类的名称。这不是json序列化程序的行为方式-它们只包含字段名。

    你能做的就是介绍另一门课。

    class MyClass implements MyInterface {
        private MyOtherClass myclass;
    }
    
    class MyOtherClass {
        private String value = "test";
    }
    
        3
  •  1
  •   Joscha    13 年前

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