Использование Groovy JsonSlurper для анализа массива объектов

Круто здесь. Я разбираю файл, содержащий список всех стран:

{
    "countries": [
      {
        "id": "1",
        "sortname": "AF",
        "name": "Afghanistan"
      },
      {
         "id": "2",
         "sortname": "AL",
         "name": "Albania"
      },
      ...
    ]
}

Я пытаюсь прочитать каждую страну в анализируемом объекте, который затем могу обработать в своем коде:

String countriesJson = new File(classLoader.getResource('countries.json').getFile()).text
def countries = new JsonSlurper().parseText(countriesJson)

countries.each { country ->
    String sortname = country.sortname
    String name = country.name

    // do something with all this info and then move on to the next country
}

Когда я запускаю этот код, я получаю MissingPropertyExceptions:

Exception in thread "main" groovy.lang.MissingPropertyException: No such property: sortname for class: java.util.LinkedHashMap$Entry
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
        at org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite.getProperty(GetEffectivePojoPropertySite.java:66)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:296)
        ...rest of stacktrace omitted for brevity

Что я могу сделать, чтобы исправить это, чтобы я мог анализировать объекты массива JSON в моих переменных sortname и name?


person smeeb    schedule 23.03.2018    source источник


Ответы (1)


Предполагая, что ваш json завернут в { ... }, поэтому он действителен (в отличие от вопроса), вам нужно сначала получить объект страны.

so:

countries.countries.each { country ->
    String sortname = country.sortname
    String name = country.name

    // do something with all this info and then move on to the next country
}

Может быть, переименовать переменную countries во что-нибудь менее запутанное?

person tim_yates    schedule 23.03.2018
comment
Извините, это была ошибка копирования и вставки с моей стороны, см. обновленный JSON. Это вообще меняет ваш ответ? - person smeeb; 23.03.2018
comment
Круто :-) Нет, нужно просто взять поле countries из разобранного json. Наличие переменной с именем countries на мгновение сбило меня с толку... Может быть, стоит подумать об изменении имени переменной на parsed или что-то в этом роде? - person tim_yates; 23.03.2018