Вопрос: JsonPath: фильтр по значению в массиве


Я пытаюсь фильтровать по значению массив в моем Json с Jsonpath. Я хочу получить длинное имя страны в JSON ниже. Для этого я отфильтровываю adress_components по типам [0] == «страна», но он, похоже, не работает.

JsonPath я попробовал:

$.results[0].address_components[?(@['types'][0]=="country")].long_name

В результате я хочу: «Канада».

JSON:

{
       "results" : [
          {
             "address_components" : [
                {
                   "long_name" : "5510-5520",
                   "short_name" : "5510-5520",
                   "types" : [ "street_number" ]
                },
                {
                   "long_name" : "Yonge Street",
                   "short_name" : "Yonge St",
                   "types" : [ "route" ]
                },
                {
                   "long_name" : "Willowdale",
                   "short_name" : "Willowdale",
                   "types" : [ "neighborhood", "political" ]
                },
                {
                   "long_name" : "North York",
                   "short_name" : "North York",
                   "types" : [ "political", "sublocality", "sublocality_level_1" ]
                },
                {
                   "long_name" : "Toronto",
                   "short_name" : "Toronto",
                   "types" : [ "locality", "political" ]
                },
                {
                   "long_name" : "Toronto Division",
                   "short_name" : "Toronto Division",
                   "types" : [ "administrative_area_level_2", "political" ]
                },
                {
                   "long_name" : "Ontario",
                   "short_name" : "ON",
                   "types" : [ "administrative_area_level_1", "political" ]
                },
                {
                   "long_name" : "Canada",
                   "short_name" : "CA",
                   "types" : [ "country", "political" ]
                },
                {
                   "long_name" : "M2N 5S3",
                   "short_name" : "M2N 5S3",
                   "types" : [ "postal_code" ]
                }
             ]
            }
       ],
       "status" : "OK"
}

Спасибо за помощь.


6


источник


Ответы:


Следующий JSONPath будет работать:

$..address_components[?(@.types[0] == 'country')].long_name

Разрушение:

  • $..address_components: сосредоточить внимание на address_components массив
  • [?(@.types[0] == 'country')]: Найти address_components вспомогательный документ, имеющий атрибут типа с именем «тип», содержащий массив, первым значением которого является «страна»,
  • .long_name: вернуть long_name атрибут этого вспомогательного документа.

Проверяется с использованием Оценщик Jayway JsonPath  и в Java:

JSONArray country = JsonPath.parse(json)
    .read("$..address_components[?(@.types[0] == 'country')].long_name");

// prints Canada
System.out.println(country.get(0));

3