在GSON / Jackson中以不同方式序列化同一类的每个引用

时间:2014-11-09 15:50:26

标签: java serialization jackson gson

假设我有一个类 A 的对象,它包含对类 B 的对象的引用,以及对类 C 的对象的引用。类 B 的对象也包含对 C 的引用:

A -> C         (1)
A -> B -> C    (2)

我希望序列化类 A 的对象,使其包含来自引用的字段 c1 c2 ( 1)和不同的领域,例如 c2 c3 来自参考文献(2)

A {
   C {
       c1: ...
       c2: ...
     },
   B {
       C {
          c2: ...
          c3: ...
         }
      }
  }

通常,GSON或Jackson可以从特定类的所有对象中排除字段,例如 c1 c2 (在两个引用中都是排除的)。

有没有办法精确选择哪些字段应该序列化哪些字段不在GSON或Jackson中? 或者如果没有,如何以其他方式进行(手动,没有GSON / Jackson)?

1 个答案:

答案 0 :(得分:1)

使用杰克逊的@JsonSerialize + custom serializer

像这样:

class A {

    @JsonSerialize(using = C1Serializer.class)
    C c;

    B b;
} 

class B {
    @JsonSerialize(using = C2Serializer.class)
    C c;
}

// you can do a lot of stuff in a custom serializer
class C1Serializer extends JsonSerializer<C> {

    static class FirstTwoFields {
        int c1
        int c2
        public FirstTwoFields(C c) {
            c1 = c.c1;
            c2 = c.c2;
        }

        //   getter and setters or delegate c's instead
        // .......
    }

    public void serialize(C c,
                      JsonGenerator jgen,
                      SerializerProvider provider){
        jgen.writeObject(new FirstTwoFields(c));
    }

}