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

2022-08-31 07:42:29

我正在将我的 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");

但是我不喜欢那里的演员阵容,有没有可能?有没有一个等效于 in 的方法,以便在它不是数组的情况下我有正确的错误处理?ClassCastExceptiongetJSONArrayorg.json


答案 1

是的,Jackson 手动解析器的设计与其他库完全不同。特别是,您会注意到 它具有通常与其他 API 中的数组节点关联的大多数功能。因此,您不需要强制转换为 要使用的。下面是一个示例:JsonNodeArrayNode

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);
    }
}

输出:

“一”
“二”
“三”

请注意,在迭代之前,请使用 来验证节点是否确实是数组。如果您对数据结构绝对有信心,则无需进行检查,但是如果需要,检查可用(这与大多数其他JSON库没有什么不同)。isArray


答案 2

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

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

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