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)