Java Jackson自定义序列化以展平对象
我有一个java pojo,如下所示:Java Jackson自定义序列化以展平对象,java,json,serialization,jackson,deserialization,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> listOfS
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是如何变平的。而不是:
"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();
}
}
公共类FooASerializer扩展了StdSerializer{
公共食品添加剂(){
这个(空);
}
受保护食品添加剂(最终t级){
超级(t);
}
@凌驾
public void serialize(最终FooA值,
最终JSONG发电机,
最终SerializerProvider提供程序)引发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());
//等等
gen.writeStringField(“t”,value.getFooB.getT());
gen.writeStringField(“i1”,value.getFooB.getI1());
gen.writeStringField(“i2”,value.getFooB.getI2());
writeEndObject将军();
}
}
但是,如果您在FooA
上有更多的字段,这可能会变得相当麻烦
那么,有没有一种方法可以告诉Jackson只序列化FooA
中的所有字段,除了FooB-FooB
中的字段,它应该在父json中进行自定义序列化以提取字段
我基本上不需要任何嵌套的JSON。您不需要为此用例编写自定义序列化程序。 只需对
FooB
使用@JsonUnwrapped
注释即可
例如:
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();
}
}
class FooA {
private String s1;
private String s2;
// other fields
@JsonUnwrapped
private FooB fooB;
//getter setter
}