Jackson如何在不强制转换的情况下将JsonNode转换为ArrayNode?

wyyhbhjk  于 2022-11-09  发布在  其他
关注(0)|答案(5)|浏览(476)

我正在将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的方法,这样我就可以在它不是数组的情况下进行正确的错误处理?

vm0i2vca

vm0i2vca1#

是的,Jackson手动解析器的设计与其他库有很大的不同。特别是,你会注意到JsonNode包含了大多数你通常会与其他API的数组节点相关联的函数。因此,你不需要强制转换为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来验证节点是否是数组。如果您对数据结构有绝对的信心,则不需要进行检查,但如果您需要,它是可用的(这与大多数其他JSON库没有什么不同)。

lo8azlld

lo8azlld2#

在Java 8中,您可以这样做:

import java.util.*;
import java.util.stream.*;

List<JsonNode> datasets = StreamSupport
    .stream(obj.get("datasets").spliterator(), false)
    .collect(Collectors.toList())
t9eec4r0

t9eec4r03#

我会假设在一天结束的时候你想通过迭代来消耗ArrayNode中的数据。为此:

Iterator<JsonNode> iterator = datasets.withArray("datasets").elements();
while (iterator.hasNext()) 
        System.out.print(iterator.next().toString() + " ");

或者如果你喜欢流和lambda函数:

import com.google.common.collect.Streams;
Streams.stream(datasets.withArray("datasets").elements())
    .forEach( item -> System.out.print(item.toString()) )
9gm1akwq

9gm1akwq4#

在org.json中是否有一个与getJSONArray等效的方法,以便在它不是数组的情况下进行正确的错误处理?
这取决于您的输入;也就是从URL中获取的内容。如果“datasets”属性的值是一个关联数组而不是一个普通数组,则会得到一个ClassCastException
不过话说回来,旧版本的正确性 * 也 * 取决于输入。在新版本抛出ClassCastException的情况下,旧版本将抛出JSONException。参考:http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)

6yoyoihd

6yoyoihd5#

通过调用JsonNode的iterator()方法获得一个迭代器,然后继续...

JsonNode array = datasets.get("datasets");

  if (array.isArray()) {
      Iterator<JsonNode> itr = array.iterator();
      /* Set up a loop that makes a call to hasNext().
      Have the loop iterate as long as hasNext() returns true.*/
      while (itr.hasNext()) {
          JsonNode item=itr.next();
          // do something with array elements
      }
  }

相关问题