gpt4 book ai didi

java - Jackson 自定义序列化以展平对象

转载 作者:行者123 更新时间:2023-11-29 06:50:49 24 4
gpt4 key购买 nike

我有一个像这样的 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。

最佳答案

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

例如:

class FooA {
private String s1;
private String s2;

// other fields

@JsonUnwrapped
private FooB fooB;

//getter setter

}

关于java - Jackson 自定义序列化以展平对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48919132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com