【发布时间】:2015-06-25 07:14:16
【问题描述】:
我陷入了需要检查嵌套 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 对象,如“信息”,我需要再次将 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 对象。我正在为 Websphere Application Server 使用 com.ibm.json.java.JSONObject.JSONObject() 本机 IBM 库,并且我没有使用其他 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;
}
【问题讨论】:
-
你是否使用过任何 JSON 解析器,例如 jakson 等?
-
各位,JSON(这个词)不是代码,不要把它格式化成代码块..
-
@TimCastelijns 有人建议我将 JSON 用作代码,所以我接受了该建议进行编辑
-
如果您将 JSON 作为原始字符串,是否可以对照正则表达式
\"country\"\s*:对其进行检查? -
@MuhammadSuleman 不,我没有使用任何其他解析器