45

有没有办法让杰克逊将单个 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会正确解析为 Data。我想避免直接篡改 JSON 本身。Jackson 中是否有一些配置我可以篡改以使其接受B

4

3 回答 3

83

试试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>>() {});
于 2013-06-08T22:54:32.540 回答
8

The Jackson 1.x-compatible version uses DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY. So the above answer changes to:

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);
于 2014-05-29T21:40:13.580 回答
0

可以通过以下代码解决上述问题,这行得通

 final ObjectMapper objectMapper = new 
 ObjectMapper().enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

 objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
 try {
      String jsonInString = objectMapper.writeValueAsString(products.get(j));
      InventoryParser inventoryParser = objectMapper.readValue(jsonInString, 
                                       InventoryParser.class);

      System.out.println(inventoryParser.getId());

     } 
     catch (IOException e) 
     {
       e.printStackTrace();
     }

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

于 2018-08-24T06:50:08.587 回答