如何过滤嵌套的 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
字符串是否包含任何嵌套值(例如 word1
、en
、word2
...)
如果您只查找 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);
我有一个如下所示的 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
字符串是否包含任何嵌套值(例如 word1
、en
、word2
...)
如果您只查找 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);