让 Jackson 将单个 JSON 对象解释为具有一个元素的数组

2022-09-01 00:25:59

有没有办法让 Jackson 将单个 JSON 对象解释为具有一个元素的数组,反之亦然?

例如,我有2种略有不同的JSON格式,我需要两者都映射到同一个Java对象:

格式 A(具有一个元素的 JSON 数组):

points : [ {
    date : 2013-05-11
    value : 123
}]

格式B(JSON对象,是的,我知道它看起来“错误”,但它是我得到的):

points : {
    date : 2013-05-11
    value : 123
}

上述两者都应转换为的目标 Java 对象:

//Data.java 
public List<Point> points;
//other members omitted

//Point.java
class Point {
    public String date;
    public int value;
}

目前,只有 A 可以正确解析为数据。我想避免直接篡改JSON本身。杰克逊中是否有一些我可以篡改的配置,以使其接受B


答案 1

尝试使用DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY - 它应该适合您。

例:

final String json = "{\"date\" : \"2013-05-11\",\"value\" : 123}";

final ObjectMapper mapper = new ObjectMapper()
        .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
final List<Point> points = mapper.readValue(json,
        new TypeReference<List<Point>>() {});

答案 2

杰克逊 1.x 兼容版本使用 .因此,上述答案更改为:DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY

final String json = "{\"date\" : \"2013-05-11\",\"value\" : 123}";

final ObjectMapper mapper = new ObjectMapper()
    .enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
final List<Point> points = mapper.readValue(json,
    new TypeReference<List<Point>>() {
    });
System.out.println(points);