【问题标题】:Serialize each reference of the same class differently in GSON/Jackson在 GSON/Jackson 中以不同方式序列化同一类的每个引用
【发布时间】:2015-01-05 22:39:46
【问题描述】:

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

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

我想序列化一个 A 类的对象,使其包含引用 中的字段 c1c2 ( 1) 和不同的领域,例如c2c3 来自参考 (2):

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

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

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

【问题讨论】:

    标签: java serialization jackson gson


    【解决方案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));
        }
    
    }
    

    【讨论】:

    • 这是一个很好的解决方案,谢谢!还有一件事:如果我想创建两种或多种不同的方式来序列化同一字段怎么办?例如:如果我正在序列化对象 A,我确实想使用 C2Serializer。但是,当我想自己序列化 B 对象时,我想使用另一个自定义序列化器,称之为 C3Serializer。例如,为每个引用创建不同的注释并在 serialize 方法中检查它是否足够: public void serialize(C c, ...) { if (c has annotation A1) .. . ... else if (c has annotation A2) ... }?
    • 您可以创建许多不同的wrapper classes,比如class WrapperA { B b; C c; },然后每个 Wrapper 在 B 和 C 上都有自己的自定义序列化程序。
    • spring mvc 4.1 支持@JsonView,你可能需要看看。
    • 我没有在这个项目中使用 Spring,但无论如何感谢您提供的信息。我还发现了flexjson,这似乎是一个在 RESTful 服务中使用的好序列化程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多