【问题标题】:Make Jackson interpret single JSON object as array with one element让 Jackson 将单个 JSON 对象解释为具有一个元素的数组
【发布时间】:2013-06-04 22:11:45
【问题描述】:

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

【问题讨论】:

    标签: java json jackson


    【解决方案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>>() {});
    

    【讨论】:

    • 看起来正是我想要的。我明天试试这个。谢谢。
    • 它在 Jackson 1.7.9 中不存在。那和你发送的链接有什么关系?
    • 你应该将Jackson库升级到至少版本2.x.x
    • 也可以使用@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)在每个字段的基础上启用它
    【解决方案2】:

    下面给出的这段代码可以解决上述问题,这行得通

     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 字符串。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-04-12
        • 2018-05-04
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        • 2019-07-29
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        相关资源
        最近更新 更多