Использование JsonPath для извлечения неоднородного списка как типизированных объектов - PullRequest
0 голосов
/ 10 марта 2020

Мне нужно проанализировать json со списком неоднородных «элементов», то есть каждый из них может иметь разные ключи / структуру, но они имеют один общий ключ (здесь называемый «a»), который дает тип элемента.

{
  "items":[
    {"a":1, "d":2},
    {"a":2, "b":{"c":2}}
  ]
}

Один из способов, который я подумал сделать, это выбрать строку json для каждого "элемента" из списка по пути "$ .items", используя что-то вроде следующего:

List<String> jsonStrings = JsonPath.parse(json).read("$.items");

так, что первая строка будет '{"a": 1, "d": 2} ", а вторая будет" {"a": 2, "b": {"c": 2 }}». Это так, что я могу продолжать задавать вопросы о внутренних битах, используя сам JsonPath. Это возможно? (Приведенный выше код завершается ошибкой, так как вместо этого JsonPath возвращает список карт.)

Альтернативным решением может быть использование «пути запроса» JsonPath (мой термин) для возврата только «элементов», например, a = 2 в качестве список карт - или список типизированных объектов, которые соответствуют вложенной структуре каждого типа элементов (возможно, общий интерфейс, содержащий ключ типа в качестве поля). Это возможно?

1 Ответ

0 голосов
/ 11 марта 2020

$.items не работает, потому что это не список строк. Это массив JSON объектов.

Я не уверен, что именно вы ищете, но есть несколько способов справиться с этим:

$.items.[*].a

Вернет все значения a. Это может быть хорошо, если у всех есть a:

[1, 2]

Если вы хотите получить что-то со значением спецификацией c для a, вы можете использовать следующий синтаксис:

$.items[?(@.a == 2)]

Возвращает:

[
  {
    "a": 2,
    "b": {
      "c": 2
    }
  }
]

См. Страницу JSONPath Github для других примеров.

...