如何过滤嵌套的 JSON 值?

How to filter nested JSON values?

我有一个如下所示的 JSON 文件。我想读取所有值并检查输入字符串是否包含 JSON 值之一,即 return true。但是通过我的尝试,总是 returns false.

{
  "RECORDS": [
    {
      "word": "word1",
      "language": "en"
    },
    {
      "word": "word2",
      "language": "en"
    },
    {
      "word": "word3",
      "language": "en"
    }
  ]
}

我的方法


 public static boolean check(String content) throws IOException {
        File file = ResourceUtils.getFile("classpath:sample.json");

        ObjectMapper mapper = new ObjectMapper();
        Map<?, ?> map = mapper.readValue(file, Map.class);
        for (Map.Entry<?, ?> entry : map.entrySet()) {
            if (content.contains(entry.getValue().toString())) {
                return true;
            } else
                return false;
        }

        return false;
    }

for (Map.Entry<?, ?> entry : map.entrySet()) 将为您提供一个 LinkedHashMap 条目。所以基本上,您的入口变量将如下所示:

为了让您的代码正常工作,您需要在执行 contains 检查

之前再次迭代这些值

试试这个:

return mapper.readValue(file, new TypeReference<Map<String, List<Map<String, String>>>>() {})
             .values()
             .stream()
             .flatMap(List::stream)
             .map(Map::values)
             .flatMap(Collection::stream)
             .anyMatch(content::contains);

上面的代码片段将检查您的 content 字符串是否包含任何嵌套值(例如 word1enword2 ...)


如果您只查找 word 字段的值,请尝试以下操作:

return mapper.readValue("", new TypeReference<Map<String, List<Map<String, String>>>>() {})
             .values()
             .stream()
             .flatMap(List::stream)
             .map(m -> m.get("word"))
             .anyMatch(content::contains);