【问题标题】:How to check if a JsonNode is a single element or an Array in Java?如何检查 JsonNode 是 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() 方法来确定节点类型。
  • 是的,对不起。我认为它更复杂,但幸运的是它很容易。

标签: java json rest spring-boot


【解决方案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()) {
    ///找到数组
    } 其他 {
    // 非数组元素
    }

    【讨论】:

    • 谢谢,这行得通。我认为确定节点的类型更加困难。
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2021-03-09
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多