0

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

我查询了许多对象,并得到如下信息:

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

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

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

4

1 回答 1

1

这有两个部分:

  1. 是否合法 JSON
  2. 它是一种合理的数据表示吗

第一个问题的答案是“是”;第二个是主观的。我会说“不”,因为除了非常通用的“地图列表”之外,Java(或 Javascript)中没有真正的类型化结构;所以它不是真正的对象模型,只是 JSON 的奇怪数据模型。

因此,虽然您显然可以使用 Jackson 将其绑定到以下内容:

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 结构没有自然的对象映射。设计它的人并没有考虑选择这种结构的含义,或者可能不是很擅长 OO。

对于它的价值,用于 JSON 样本包含的内容的更常见模型将类似于:

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

这也很容易映射到 Java 对象。

于 2012-06-05T05:14:12.990 回答