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

时间:2013-06-08 21:03:42

标签: java json jackson

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

示例,我有两种略有不同的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

3 个答案:

答案 0 :(得分:61)

尝试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>>() {
        });
System.out.println(points);

答案 1 :(得分:8)

Jackson 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);

答案 2 :(得分:0)

可以通过下面给出的代码解决上述问题,这有效

<div [@fadeInDelay]="{value: '', params: { delay: 1000}}"></div>
<div [@fadeInDelay]="{value: '', params: { delay: 2000}}"></div>
<div [@fadeInDelay]></div> //using fallback

“ InventoryParser”是POJO类。 “ products.get(j)”是JSON字符串。