Java Jackson如何在不强制转换的情况下将JsonNode转换为ArrayNode?
我正在将我的JSON库从org.JSON更改为Jackson,并希望迁移以下代码: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
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())