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

时间:2019-03-19 06:45:35

标签: 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":"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结构最低元素的路径,以便将其与列表匹配?

3 个答案:

答案 0 :(得分:1)

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) {
                ...
            }
        } 
    }

供参考:

http://developer.android.com/reference/org/json/JSONObject.html#has(java.lang.String)

答案 1 :(得分:0)

如果您要检查JSONObject属性的存在,则有一种称为has的方法。 This是官方文档的链接。

答案 2 :(得分:0)

我找到了一个解决方案,因为在我的特殊情况下,结构始终为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);
    }
}