我有以下课程:
public class Foo {
private Bar[] bars;
@JsonCreator
public Foo(Bar[] bars) {
this.bars = bar;
}
}
我希望序列化的json看起来像这样:
[
{
"x": 1,
"b": "b1"
},
{
"x": 2,
"b": "b2"
}
]
,其中此数组中的每个元素都是Bar
。我尝试放入@JsonFormat(shape=JsonFormat.Shape.ARRAY)
,但是序列化的json以[[
开头,这可能很有意义,因为整个对象随后变成了数组。
在这里编写自定义序列化器是唯一的方法吗?
答案 0 :(得分:0)
例如,如果您有一个返回Bar[]
数组的控制器方法,而不是包装该数组的Foo对象,那么您将得到以下响应:
@GetMapping("test")
public Test[] test() {
return new Test[] { new Test(), new Test() };
}
响应:
[
{
"x": 1,
"b": "b1"
},
{
"x": 2,
"b": "b2"
}
]
答案 1 :(得分:0)
使用com.fasterxml.jackson.annotation.JsonValue
注释。从2.9
版本开始,如果您使用旧版本的注释getter方法,则可以注释字段。
@JsonValue
private Bar[] bars;
答案 2 :(得分:0)
您可以为自己创建一个customised Serializer
,它将告诉Jackson
如何序列化对象。
public class FooSerializer extends StdSerializer<Foo> {
public FooSerializer() {
this(null);
}
public FooSerializer(Class<Foo> t) {
super(t);
}
@Override
public void serialize(Foo value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeStartArray();
for (Bar bar : value.getBars()) {
if (bar != null) {
jgen.writeObject(bar);
}
}
jgen.writeEndArray();
}
}
在您的foo类上,告诉jackson
使用此序列化程序
@JsonSerialize(using = FooSerializer.class)
public class Foo { ... }