如何检查 JsonNode 是 Java 中的单个元素还是数组?
Posted
技术标签:
【中文标题】如何检查 JsonNode 是 Java 中的单个元素还是数组?【英文标题】:How to check if a JsonNode is a single element or an Array in Java? 【发布时间】:2019-01-20 16:52:51 【问题描述】:我正在使用 JsonNode (com.fasterxml.jackson.databind.JsonNode) 遍历 json 响应
如何检查给定的 JsonNode 是单个元素还是数组?,因为我需要更深入地遍历它,并更新一些值(例如,名称值)
我可以有这样的 json 响应:(使用单个元素)
person:
name: "name1",
address: "address1"
或者我可以有这样的 json 响应:(带有 )
"person": [
"name": "name1",
"address": "address1"
,
"name": "name2",
"address": "address2"
]
对于单个元素,我有以下代码:
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(jsonString);
JsonNode personNode = root.findPath("person");
if(!personRootNode.isMissingNode())
((ObjectNode)nameNode).put("name","UPDATED NAME");
而且,对于一个数组元素,我有这个代码
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(jsonString);
JsonNode personNode = root.findPath("person");
if(!personNode .isMissingNode())
for(JsonNode node: personRootNode)
if(!node.isMissingNode())
((ObjectNode)node).put("name","UPDATED NAME");
我想在一个地方混合逻辑,因为唯一的区别是for循环
我可以将替换逻辑包装在一个函数/方法中。 但是如何判断当前节点是元素还是数组呢?
【问题讨论】:
personNode.isArray()
这是你要的吗?
是的,这就是我想要的。非常感谢
请阅读文档,即JsonNode
的javadoc,你会发现很多isXxx()
方法来确定节点类型。
是的,对不起。我认为它更复杂,但幸运的是它很容易。
【参考方案1】:
使用下面的方法。输入要检查的 JSONObject 和节点名称。(使用 org.json.JSONObject)
private void checkNodeStatus(JSONObject jsonObject, String node)
if (jsonObject.optJSONArray(node) != null)
else if (jsonObject.optString(node) != null)
JSONArray array = new JSONArray();
array.put(jsonObject.getJSONObject(node));
jsonObject = jsonObject.put(node, array);
else
System.out.println("error in checkNodeStatus > node : " + node);
如果是 JSONObject,则转换为 JSONArray。
【讨论】:
【参考方案2】:您可以在 JsonNode 对象上调用 isArray() 函数。例如:
ObjectMapper 映射器 = 新 ObjectMapper(); JsonNode root = mapper.readTree(s2); JsonNode personNode = root.findPath("person"); if(personNode.isArray()) ///找到数组 其他 // 非数组元素【讨论】:
谢谢,这行得通。我认为确定节点的类型更加困难。以上是关于如何检查 JsonNode 是 Java 中的单个元素还是数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 JSON 字符串解析为 Jackson 中的 JsonNode?
在Jackson中将Java对象转换为JsonNode [重复]
Jackson 中的 ObjectNode 和 JsonNode 有啥区别?
JsonNode 中的 asText() 和 toString() 有啥区别?
杰克逊错误:java.lang.NoSuchMethodError:`com.fasterxml.jackson.databind.JsonNode.asText(Ljava/lang/String;