我有一个Java方法,它将接收一个缩小的JSON字符串,类似于:
{
"fizz": {
"_id": "6"
}
}
{
"foo": "bar"
}
... (same two above objects repeated but with different values)
因此,缩小字符串将{"fizz":{"_id":"6"}}
。每次调用该方法时,字符串都会有所不同(显然),但它将遵循以下格式:
"CHUNK" Consists of:
{"<ANYTHING>":{"_id":"<SOME_NUMBER>"}}{<ANY_JSON_OBJECT>}
因此,作为另一个示例,该方法可能会接收以下字符串作为输入(不缩小它以使示例更清晰):
{
"fizz": {
"_id": "6"
}
}
{
"foo": "bar"
}
{
"swarm": {
"_id": "18"
}
}
{
"whistle": "feather",
"saywhat": true
}
{
"beef": {
"_id": "23"
}
}
{
"active": "NO"
}
我需要提取给定 JSON 中所有_id
字符串值的列表,因此在上面的示例中,我想最终得到一个包含"6"、"18"和"23"的List<String>
。我最好的尝试:
public List<String> extractIds(String json) {
Pattern pattern = Pattern.compile(""_id":.*");
Matcher matcher = pattern.matcher(json);
List<String> ids = new ArrayList<>();
while(matcher.find()) {
ids.add("???");
}
return ids;
}
但我不确定我的正则表达式是否被抬起和/或如何使用 Matcher API 提取组中下一个提取的 ID。
有什么想法我哪里出了问题吗?
你可以试试这个:
Pattern pattern = Pattern.compile(""_id"\s*:\s*"(.*?)"");
Matcher matcher = pattern.matcher(json);
List<String> ids = new ArrayList<>();
while(matcher.find()) {
ids.add(matcher.group(1));
}
解释-
"_id"
检查前面"_id"
部分,
\s*:\s*
检查零个或多个空格、冒号:
以及零个或多个空格(我可能可以省略空格部分,但我不熟悉 JSON,所以我不知道是否可以有多个空格)
"(.*?)"
创建组 1,其中包含包含在 ""
中的所需 id(如果您希望数组中的双引号,请使用正则表达式"_id"\s*:\s*(.*?)
)
最后,每当我们找到正则表达式的匹配项时,我们都会使用 matcher.group(1)
将组 1 的内容添加到 ArrayList 中