我有一个像这样的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。
答案 0 :(得分:4)
您不需要为此用例编写自定义序列化程序。
只需使用@JsonUnwrapped
的{{1}}注释。
E.g:
FooB