Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson如何在不强制转换的情况下将JsonNode转换为ArrayNode?_Java_Arrays_Json_Jackson - Fatal编程技术网

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

Java Jackson如何在不强制转换的情况下将JsonNode转换为ArrayNode?,java,arrays,json,jackson,Java,Arrays,Json,Jackson,我正在将我的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(DATA

我正在将我的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
? 在
org.json
中是否有一个与
getJSONArray
等效的方法,以便在它不是数组的情况下进行正确的错误处理

在org.json中是否有一个与getJSONArray等效的方法,以便在它不是数组的情况下进行正确的错误处理

这取决于你的投入;i、 e.从URL获取的内容。如果“datasets”属性的值是一个关联数组而不是普通数组,则会得到一个
ClassCastException


但同样,旧版本的正确性也取决于输入。在新版本抛出
ClassCastException
的情况下,旧版本将抛出
JSONException
。参考资料:

是的,Jackson手动解析器设计与其他库有很大不同。特别是,您会注意到
JsonNode
具有大多数通常与其他API的数组节点关联的函数。因此,您不需要强制转换到
ArrayNode
即可使用。下面是一个例子:

JSON:

代码:

输出:

“一个”
“两个”
“三个”


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

我假设在一天结束时,您希望通过迭代来使用ArrayNode中的数据。为此:

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

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

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

List<JsonNode> datasets = StreamSupport
    .stream(obj.get("datasets").spliterator(), false)
    .collect(Collectors.toList())
import java.util.*;
导入java.util.stream.*;
列表数据集=流支持
.stream(obj.get(“数据集”).spliterator(),false)
.collect(收集器.toList())

不幸的是,我无法使用完全映射,因为数据没有固定的字段名。如果字段名来自有限的集合,您可能需要定义一个具有所有字段名的类,并使用反序列化器的
FAIL\u ON\u UNKNOWN\u属性
功能仅在未使用的字段中返回空值。但是,这当然只是一个选项,如果字段名集相对有限。嗯,我认为这个解决方案不适合我的情况,但我会记住它,以防我在使用有限集时遇到问题,这是事先知道的!啊,好吧,这样我就可以抓住一个ClassCastException了,谢谢!就我的口味而言,它比有一个特定的JsonException稍微不那么优雅,但如果不可能,那仍然很好。我可以知道为什么在“For(final JsonNode objNode:arrNode)”行中使用“final”吗?我想知道他们为什么不在
拆分器中添加
stream()
方法。
Iterator<JsonNode> iterator = datasets.withArray("datasets").elements();
while (iterator.hasNext()) 
        System.out.print(iterator.next().toString() + " "); 
import com.google.common.collect.Streams;
Streams.stream(datasets.withArray("datasets").elements())
    .forEach( item -> System.out.print(item.toString()) )
import java.util.*;
import java.util.stream.*;

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