我陷入一种情况,我需要检查嵌套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变量引用具有一个称为“名称”的属性的对象数组。我不知道最好的方法,但这就是我的工作吗?