Java 如何在不多次调用.getJSONObject(key)的情况下检查JSONObject中是否存在属性?

Java 如何在不多次调用.getJSONObject(key)的情况下检查JSONObject中是否存在属性?,java,json,org.json,Java,Json,Org.json,我正在处理深度嵌套的JSON数据。以下是一个简短的示例: { "timestamp":"123", "layers":{ "frame_raw":"123", "frame":{ "frame_frame_interface_id":"0", "frame_interface_id_frame_interface_name":"asd", ... }, "eth_raw"

我正在处理深度嵌套的JSON数据。以下是一个简短的示例:

{  
   "timestamp":"123",
   "layers":{  
      "frame_raw":"123",
      "frame":{  
         "frame_frame_interface_id":"0",
         "frame_interface_id_frame_interface_name":"asd",
         ...
      },
      "eth_raw":"123",
      "eth":{  
         "eth_eth_dst_raw":"asd",
         "eth_eth_dst":"asd",
         ...
      },
      "ip_raw":"123",
      "ip":{  
         "ip_ip_version_raw":"4",
         "ip_ip_version":"4",

         "ip_ip_addr_raw":[  
            "asd",
            "asd"
         ],
         "ip_ip_addr":[  
            "1.1.1.1",
            "1.1.1.1"
         ],
         "ip_ip_dst_host":"1.1.1.1"
      }
      ...
   }
   ...
}
我有一个明确允许的结构列表。应该从JSON中删除所有其他内容。列表示例如下:

###frame###
layers.frame_raw
###eth###
layers.eth.eth_eth_dst
layers.eth.eth_eth_src
###ip###
layers.ip.ip_ip_src
layers.ip.ip_ip_dst
layers.ip.ip_ip_src_host
layers.ip.ip_ip_dst_host
layers.ip.ip_ip_version
layers.ip.ip_ip_hdr_len
layers.ip.ip_ip_dsfield
我的问题是,我只能使用“getJSONObject(key)”浏览JSON结构


如何以“key.key.key…”的形式生成JSON结构中最低元素的路径,以便与列表匹配?

如果要检查
JSONObject
的属性是否存在,有一个名为
has
的方法。是到官方文档的链接。

我找到了一个解决方案,因为我的特例中的结构总是
layers.layer.property
,所以结构的深度总是相同的,而不是可变的

有兴趣的人士:

for (Iterator<String> layersIterator = jsonObject.getJSONObject("layers").keys(); layersIterator.hasNext(); ) {
    String layer = layersIterator.next();
    for (Iterator<String> propertyIterator = jsonObject.getJSONObject("layers").getJSONObject(layer).keys(); propertyIterator.hasNext(); ) {
        String property = propertyIterator.next();
        System.out.println("layers."+layer+"."+property);
    }
}
for(迭代器layersIterator=jsonObject.getJSONObject(“layers”).keys();layersIterator.hasNext();){
String layer=layersIterator.next();
for(迭代器propertyIterator=jsonObject.getJSONObject(“层”).getJSONObject(层).keys();propertyIterator.hasNext();){
字符串属性=PropertyInterator.next();
System.out.println(“层+”层+“+属性);
}
}

JSON对象有一个名为.has的方法,该方法将返回一个布尔值。因此,逻辑类似于检查JSON对象是否存在。如果是这样,请检查子节点是否存在更多数据。如果存在数组,则必须获取该数组,并使用任何循环在该数组中进行迁移,然后执行相同的操作。例如:

   if (json.has("ip")) {
        JSONObject jsonObject = getJSONObject.getString("ip")
        String ip_ip_version_raw = jsonObject.getString("ip_ip_version_raw"));
        if (jsonObject.has("ip_ip_addr_raw")){
            JSONArray ip_ip_addr_raw = jsonObject.getJSONArray("ip_ip_addr_raw");
            for (String s : ip_ip_addr_raw) {
                ...
            }
        } 
    }
供参考:


我知道这个方法,但它对我没有什么帮助。基本上我需要所有最深钥匙的“路径”。有没有简单的方法可以做到这一点?
org.json
是基于
Map
的简单工具。如果您需要
JSONPath
之类的东西,请使用或