当前位置: 首页 > 面试题库 >

检查嵌套JSON中是否存在密钥

翟新
2023-03-14
问题内容

我陷入一种情况,我需要检查嵌套JSON对象中是否存在密钥。通过嵌套的JSON对象,我在父JSON对象中具有一个JSON对象作为其键之一的值。所以我需要检查此密钥是否存在于整个JSON对象中。我将以下数据作为String对象。我知道我可以解析此String对象以获得JSON对象。

{
"claim_loss_type_cd": "TEL",
"claim_type": "002",
"claim_reason": "001",
"policy_number": "1234kk3366ff664",
"info": {
    "ApplicationContext": {
        "country": "US"
    }
  }
}

我已经使用containsKey()方法来检查主要JSON对象中密钥的存在,并且它可以工作。但是对于检查任何内部JSON对象(例如“
info”),我需要Object再次将其解析为JSON对象,然后再次检查密钥。

        String jsonString = "My JSON String here";
        JSONObject finalResponse = new JSONObject(jsonString);
        finalResponse.containsKey("country"); // will return false
        JSONObject intermediateResponse = (JSONObject)finalResponse.get("info");
        intermediateResponse.containsKey("country"); // will return true

因此,有没有更好的方法,任何API或方法都可以在内部JSON对象中进行检查,而无需解析内部JSON对象。我正在将com.ibm.json.java.JSONObject.JSONObject()本机IBM库用于Websphere
Application Server,并且没有正在使用的其他JSON解析器。

考虑上述JSON,例如“ claim_type”是父JSON对象中的键,而“
info”本身是JSON对象。因此,我需要做的是检查密钥是否存在于完整的JSON中,无论是在父级还是其子级JSON对象中的任何一个(例如此处的密钥“国家”)中。

编辑:

感谢@chsdk,我找到了解决方案。但是,如果其他人使用其他一些API来解决任何问题,请回答,因为下面的解决方案考虑了递归并且可能具有很大的时空复杂性。

public static boolean checkKey(JSONObject object, String searchedKey) {
    boolean exists = object.containsKey(searchedKey);
    if(!exists) {      
         Set<String> keys = object.keySet();
         for(String key : keys){
             if ( object.get(key) instanceof JSONObject ) {
                    exists = checkKey((JSONObject)object.get(key), searchedKey);
            }
         }
    }
    return exists;
}

问题答案:

您可以使用 JSONObject
解析json并使用其 has(String
key)

方法检查此Json中是否存在某个键:

 String str="{\"claim_loss_type_cd\": \"TEL\",\"claim_type\":\"002\",\"claim_reason\": \"001\",\"policy_number\":\"1234kk3366ff664\",\"info\": {\"ApplicationContext\":{\"country\": \"US\"}}}";
 Object obj=JSONValue.parse(str);
 JSONObject json = (JSONObject) obj;
 //Then use has method to check if this key exists or not
 System.out.println(json.has("claim_type")); //Returns true

编辑:

或者更好的是,您可以简单地检查JSON字符串是否包含此键值,例如使用indexOf()method:

String str="{\"claim_loss_type_cd\": \"TEL\",\"claim_type\":\"002\",\"claim_reason\": \"001\",\"policy_number\":\"1234kk3366ff664\",\"info\": {\"ApplicationContext\":{\"country\": \"US\"}}}";
System.out.println(str.indexOf("claim_type")>-1); //Returns true

编辑2:

看一下此方法,它会在嵌套对象上进行迭代以检查键是否存在。

public boolean keyExists(JSONObject  object, String searchedKey) {
    boolean exists = object.has(searchedKey);
    if(!exists) {      
        Iterator<?> keys = object.keys();
        while( keys.hasNext() ) {
            String key = (String)keys.next();
            if ( object.get(key) instanceof JSONObject ) {
                    exists = keyExists(object.get(key), searchedKey);
            }
        }
    }
    return exists;
}

Object obj=JSONValue.parse(str);
JSONObject json = (JSONObject) obj;
System.out.println(keyExists(json, "country")); //Returns true


 类似资料:
  • 我陷入了需要检查嵌套JSON对象中是否存在键的情况。通过嵌套JSON对象,我在父JSON对象中有一个JSON对象作为其键之一的值。所以我需要检查这个键是否存在于整个JSON对象中。我将以下数据作为对象获取。我知道我可以解析这个对象以获取JSON对象。 我使用了方法来检查主JSON对象中是否存在密钥,它可以正常工作。但是要检查任何内部JSON对象,比如“info”,我需要再次将解析为JSON对象,然

  • 所以,我从服务器上获得了一些JSON值,但我不知道是否会有一个特定的字段。 比如: 有时,会有一个额外的字段,如: 我想检查名为“club”的字段是否存在,这样在解析时我就不会得到 组织。json。JSONException:俱乐部没有价值

  • 问题内容: 在简单的清单中,下面的检查很简单: 但如果是列表列表,例如: 为了退货该如何解决? 问题答案: 使用内置功能尝试此操作。这是最惯用的解决方案,并且效率很高,因为一旦找到第一个匹配项,就会短路并停止:

  • 我不熟悉shell脚本,我有一个用于导入cert和使用keytool导入keystore的脚本。此脚本位于Pod中,有时我必须重新启动Pod,有时当此脚本运行时,我会出现此错误 现有条目别名服务器存在,覆盖?[no]:输入新别名(返回以取消此条目的导入): 我知道有命令列出别名 它给出了输出 服务器,2022年6月22日,PrivateKeyEntry,证书指纹(SHA-256):AC:DC:12

  • 我想验证检查密钥是否存在。 有时,会有一个额外的字段,如: 所以我想检查“联系人”键是否存在

  • 问题内容: 我有下一个JSON: 知道JSON对象中是否存在“ dog”值的最佳方法是什么? 谢谢。 解决方案1 解决方案2(JQuery) 解决方案3(使用some()方法) 问题答案: JSON变量引用具有一个称为“名称”的属性的对象数组。我不知道最好的方法,但这就是我的工作吗?