Извлечение идентификаторов JSON с помощью API Java Regex / Matcher - PullRequest
0 голосов
/ 17 января 2019

У меня есть метод 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 для извлечения следующего извлеченного идентификатора в группе.

Есть идеи, куда я иду?

1 Ответ

0 голосов
/ 17 января 2019

Вы можете попробовать это:

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\"\\s*:\\s*(.*?))

Наконец, когда мы находим совпадение с регулярным выражением, мы добавляем содержимое group 1 в ArrayList, используя matcher.group(1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...