JSON Java—是否可以一次遍历多个JSON层来搜索特定值?
想象一下,我有一个更大的版本:JSON Java—是否可以一次遍历多个JSON层来搜索特定值?,java,json,Java,Json,想象一下,我有一个更大的版本: { "name": "a", "age": 10, "number": 254, "spezial": [{ "name": "vip", "age": 12, "number": 134 }, { "name": "b", "age": 56, "number": 934 }] } 现在我想要的是类似于json.containsValue(“vip”)的东西,如果有
{
"name": "a",
"age": 10,
"number": 254,
"spezial": [{
"name": "vip",
"age": 12,
"number": 134
}, {
"name": "b",
"age": 56,
"number": 934
}]
}
现在我想要的是类似于json.containsValue(“vip”)
的东西,如果有值“vip”somewere,则返回true;如果没有,则返回false。我真的不想逐个遍历每个子数组,我需要十行代码来测试是否有重复…
感谢您考虑我的问题如果值只是一个字符串,并且您只需要一个布尔返回值,为什么不尝试String.contains(“:\“vip\”)?此方法将递归搜索给定字符串的所有对象和数组值:
static boolean findValue(Object node, String value) {
if (node instanceof String) {
return node.equals(value);
}
else if (node instanceof JSONArray) {
for (Object obj : (JSONArray)node) {
if (findValue(obj, value)) {
return true;
}
}
}
else if (node instanceof JSONObject) {
for (Object obj : ((JSONObject)node).values()) {
if (findValue(obj, value)) {
return true;
}
}
}
return false;
}
样本使用:
public static void main(String[] args) throws ParseException {
Object json = new JSONParser().parse(
"{" +
" \"name\": \"a\"," +
" \"age\": 10," +
" \"number\": 254," +
" \"spezial\": [{" +
" \"name\": \"vip\"," +
" \"age\": 12," +
" \"number\": 134" +
" }, {" +
" \"name\": \"b\"," +
" \"age\": 56," +
" \"number\": 934" +
" }]" +
"}");
System.out.println(findValue(json, "vip"));
System.out.println(findValue(json, "foo"));
}
输出:
true
false
尝试下面的代码,它应该可以工作
if(JSON.stringify(dataObject).indexOf('"vip"') != -1){
return true;
} else {
return false;
}
注意:dataObject是您的JSON对象
将其放在一个单独的函数中作为util使用。您使用的是哪个JSON库?该值可以映射到任何键?我的意思是您需要检查所有元素以确认vip不存在。在性能方面你无能为力。@BenArnao我认为问题不在于性能。@shmosel json-simple-1.1.1和yes,any,都不重要假定冒号后面正好有一个空格。另外,数组值是否也应该计算也不清楚。JSON文件相当大,我了解到制作巨大字符串是不好的做法,还是没关系?@harlekintiger你如何在没有字符串的情况下解析JSON?我们可以去掉空格,然后在这种情况下进行检查。如果你不处理信息,这并不重要。对于您的问题,我假设您只需要一个布尔值。对不起,我将花一些时间来完全测试这一点。。但它看起来很完美,非常感谢instanceof',findValue()',听起来不错,我将在文档中阅读更多关于它们的信息这是什么语言?实际上,这可能比其他递归答案更快。但是需要处理特殊情况,其中密钥本身被命名为搜索项。我也不确定“vip”在java中是否有效。您可能需要避开双引号,如“vip”,这是javascript。。如果要在Java中实现这一点,可以使用JSON解析器(Jackson-import-this在pom.xml中或使用jar)。创建与json相关的java对象。。CustomObject ob=new ObjectMapper().readValue(yourjsonInStringFormat,CustomObject.class);然后您可以遍历“spezial”对象列表。