首页 > 解决方案 > 使用 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"
}

我需要提取_id给定 JSON 中所有字符串值的列表,因此在上面的示例中,我希望以List<String>包含“6”、“18”和“23”的结尾。我最好的尝试:

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。

有什么想法我会出错吗?

标签: regexjava-8

解决方案


你可以试试这个:

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 不熟悉,所以我不知道是否可以有多个空格与否)
\"(.*?)\"创建包含所需 id 的第 1 组,包含在其中""(如果您想要数组中的双引号,则使用 regex \"_id\"\\s*:\\s*(.*?)

最后,每当我们找到正则表达式的匹配项时,我们将组 1的内容添加到 ArrayList,使用matcher.group(1)


推荐阅读