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

新手上路,请多包涵

我正在将我的 JSON 库从 org.json 更改为 Jackson,我想迁移以下代码:

 JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray =  datasets.getJSONArray("datasets");

现在在杰克逊,我有以下内容:

 ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");

但是我不喜欢那里的演员表,是否有可能 ClassCastException ?是否有等同于 getJSONArray in org.json 的方法,以便在它不是数组的情况下进行适当的错误处理?

原文由 Konrad Höffner 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

是的,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 库没有什么不同)。

原文由 Perception 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

原文由 Ori Popowski 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题