杰克逊对杰森的特殊性或“为什么这是一个很好的答复?”

时间:2012-06-04 23:45:54

标签: json jackson

我对Jackson& Json但我已经使用它了,主要是使用对象映射器,总是定义我自己的类并且工作非常面向对象。最近,我决定自学一些Android编程,并在此过程中查询来自使用JSON编码进行回复的第三方Web服务的数据。其中一个回复让我感到困惑。

我查询了许多对象,得到这样的东西:

JSON: 
[
  {"num":"2","total":"2"},
  {"id":"1234", ...more fields...},
  {"id":"1235", ...more fields...}
]

这与我的标准Jackson approches无法解析,因为从我读它的方式来看,这表明数组的开始,第一个元素的类型与以下元素的类型不同。我目前无法将其建模为POJO以允许标准的Jackson映射。 (老实说,我不认为这是正确的语法)我仍然可以通过一些基本的字符串编辑轻松地解决这个问题,但我认为我必须误解一些东西。如果这是一个愚蠢的问题,请原谅我。感谢您的帮助,我非常期待您的回复。

编辑1:感谢Hot Licks,他确认了我的自我怀疑=)。有人可以建议一个正确的方法来模拟杰克逊,或者这真的是杰克逊比JSON更具体的情况吗?

1 个答案:

答案 0 :(得分:1)

这有两个部分:

  1. 是合法的JSON
  2. 这是一个合理的数据表示
  3. 对于第一个问题,答案是“是”;第二个是主观的。我会声称“不”,因为除了非常通用的“地图列表”之外,Java中没有真正的类型结构(或Javascript)。所以它实际上不是一个对象模型,只是一个奇怪的JSON数据模型。

    因此,虽然你可以使用杰克逊明确地将其绑定到:

    List<Map<String,Object>> list = (List<Map<String,Object>>) mapper.readValue(jsonSource, List.class);
    

    使用它会有点麻烦。

    然而。你可以使用两步处理:首先进入上面提到的“无类型”列表;然后将地图转换为您想要的实际对象,例如:

    Iterator<Map<String,Object>> it = list.iterator();
    HeaderOb header = mapper.convertValue(it.next(), HeaderOb.class); // has 'num' and 'total'
    while (it.hasNext()) {
      ValueOb value = mapper.convertValue(it.next(), ValueOb.class); // has 'id', others
    }
    

    没有单相方法的原因是,上面描述的JSON结构没有自然的Object映射。设计它的人并没有考虑选择这样一个结构的影响,或者可能不是很擅长OO。

    对于它的价值,用于JSON样本包含的东西的更常见的模型将是:

    {
      "num" : 2,
      "total" : 2,
      "entries" : [
         { "id": ... },
         ...
      ]
    }
    

    也可以轻松映射到Java对象。