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”对象列表。