jackson如何将JsonNode转换为ArrayNode而不投射?
我正在改变我的JSON库从org.json到jackson,我想迁移下面的代码:
JSONObject datasets = readJSON(new URL(DATASETS)); JSONArray datasetArray = datasets.getJSONArray("datasets");
现在在jackson我有以下几点:
ObjectMapper m = new ObjectMapper(); JsonNode datasets = m.readTree(new URL(DATASETS)); ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");
不过,我不喜欢那里的演员,是否有可能发生ClassCastException
? 在org.json
是否有一个等价于getJSONArray
的方法, getJSONArray
在不是数组的情况下有适当的error handling?
是的,jackson的手动parsing器devise与其他库非常不同。 尤其是,您会注意到JsonNode
具有大部分通常与其他API的数组节点关联的function。 因此,您不需要投射到ArrayNode
来使用。 这是一个例子:
JSON:
{ "objects" : ["One", "Two", "Three"] }
码:
final String json = "{\"objects\" : [\"One\", \"Two\", \"Three\"]}"; final JsonNode arrNode = new ObjectMapper().readTree(json).get("objects"); if (arrNode.isArray()) { for (final JsonNode objNode : arrNode) { System.out.println(objNode); } }
输出:
“一”
“二”
“三”
注意使用isArray
在迭代之前validation节点实际上是一个数组。 如果你对你的数据结构有绝对的信心,这个检查是没有必要的,但是如果你需要的话,这个检查是可用的(这与大多数其他JSON库没有什么不同)。
在org.json中是否有一个等价于getJSONArray的方法,以便在不是数组的情况下有适当的error handling?
这取决于你的意见; 即你从URL中获取的东西。 如果“datasets”属性的值是一个关联数组而不是一个普通数组,则会得到一个ClassCastException
。
但是再一次,旧版本的正确性也取决于input。 在新版本抛出ClassCastException
的情况下,旧版本将抛出JSONException
。 参考: http : //www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)