【发布时间】: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