【问题标题】:Jackson Custom Serialization to Flatten ObjectJackson 自定义序列化以展平对象
【发布时间】:2018-02-22 03:23:25
【问题描述】:

我有一个这样的 java pojo:

public class FooA {
    private String s1;
    private String s2;
    private int i;
    private double d1;
    private double d2;
    private Timestamp timestamp;
    private LocalDate date;
    private List<String> listOfStrings;
    private FooB fooB;

    //Constructors & getters
}

public class FooB {
    private String t;
    private int i1;
    private int i2;

    //Constructors & getters
}

我想把FooA对象序列化成这个json:

{
   "s1":"something",
   "s2":"somethingelse",
   "i":2,
   "d1":10.0,
   "d2":20.0,
   "timestamp":38743488,
   "date":null,
   "listOfStrings":[
        "string1",
        "string2",
        "string3"
   ],
   "t":"fooBString",
   "i1":100,
   "i2":200
}

注意 FooA 是如何展平的。而不是:

"fooB":{  
      "t":"fooBString",
      "i1":100,
      "i2":200
}

在 JSON 的底部,它已被展平以将这些字段提取到父 json 中。

我可以像这样编写自定义序列化程序:

public class FooASerializer extends StdSerializer<FooA> {
    public FooASerializer() {
        this(null);
    }

    protected FooASerializer(final Class<FooA> t) {
        super(t);
    }

    @Override
    public void serialize(final FooA value,
                          final JsonGenerator gen,
                          final SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("s1", value.getS1());
        gen.writeStringField("s2", value.getS2());
        gen.writeStringField("i", value.getI());
        gen.writeStringField("d1", value.getD1());
        gen.writeStringField("d2", value.getD2());
        //etc etc
        gen.writeStringField("t", value.getFooB.getT());
        gen.writeStringField("i1", value.getFooB.getI1());
        gen.writeStringField("i2", value.getFooB.getI2());
        gen.writeEndObject();
    }
}

但是,FooA 上的字段越多,这就越麻烦。

那么有没有办法告诉 Jackson 只序列化 FooA 中的所有字段,通常除了 FooB fooB 之外,它应该在提取父 json 中的字段时进行自定义序列化。

我基本上不想要任何嵌套的 JSON。

【问题讨论】:

    标签: java json serialization jackson deserialization


    【解决方案1】:

    您无需为此用例编写自定义序列化程序。 只需对FooB 使用@JsonUnwrapped 注释即可。

    例如:

    class FooA {
        private String s1;
        private String s2;
    
      // other fields 
    
        @JsonUnwrapped
        private FooB fooB;
    
    //getter setter
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 2016-01-11
      • 2012-07-07
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多