Jackson:使用一个数组字段序列化/反序列化对象

时间:2019-11-18 11:58:43

标签: java json jackson

我有以下课程:

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以[[开头,这可能很有意义,因为整个对象随后变成了数组。

在这里编写自定义序列化器是唯一的方法吗?

3 个答案:

答案 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 { ... }