杰克逊自定义序列化以展平对象

时间:2018-02-22 03:23:25

标签: java json serialization jackson deserialization

我有一个像这样的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上的更多字段,这可能会非常麻烦。

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

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

1 个答案:

答案 0 :(得分:4)

您不需要为此用例编写自定义序列化程序。 只需使用@JsonUnwrapped的{​​{1}}注释。

E.g:

FooB