我对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更具体的情况吗?
答案 0 :(得分:1)
这有两个部分:
对于第一个问题,答案是“是”;第二个是主观的。我会声称“不”,因为除了非常通用的“地图列表”之外,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对象。