使用 Java Regex/Matcher API 提取 JSON ID



我有一个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 中

最新更新