Работа с JSON в Groovy

Работа с JSON в Groovy

1. Вступление

В этой статье мы собираемся описать и увидеть примеры того, как работать с JSON в приложенииGroovy.

Прежде всего, чтобы запустить примеры из этой статьи, нам нужно настроить нашpom.xml:


    
        // ...
        
            org.codehaus.gmavenplus
            gmavenplus-plugin
            1.6
        
    


    // ...
    
        org.codehaus.groovy
        groovy-all
        2.4.13
    

Самый последний плагин Maven можно найтиhere и последнюю версиюgroovy-allhere.

2. Разбор Groovy-объектов в JSON

Преобразовать объекты в JSON в Groovy довольно просто, допустим, у нас есть классAccount:

class Account {
    String id
    BigDecimal value
    Date createdAt
}

Чтобы преобразовать экземпляр этого класса в JSONString,, нам нужно использовать классJsonOutput и вызвать статический методtoJson():

Account account = new Account(
    id: '123',
    value: 15.6,
    createdAt: new SimpleDateFormat('MM/dd/yyyy').parse('01/01/2018')
)
println JsonOutput.toJson(account)

В результате мы получим проанализированный JSONString:

{"value":15.6,"createdAt":"2018-01-01T02:00:00+0000","id":"123"}

2.1. Настройка вывода JSON

Как мы видим, вывод даты - это не то, что нам нужно. Для этого, начиная с версии 2.5, пакетgroovy.json поставляется со специальным набором инструментов.

С помощью классаJsonGenerator мы можем определить параметры вывода JSON:

JsonGenerator generator = new JsonGenerator.Options()
  .dateFormat('MM/dd/yyyy')
  .excludeFieldsByName('value')
  .build()

println generator.toJson(account)

В результате мы получим отформатированный JSON без исключенного поля значения и с форматированной датой:

{"createdAt":"01/01/2018","id":"123"}

2.2. Форматирование вывода JSON

С помощью описанных выше методов мы увидели, что вывод JSON всегда был в одной строке, и это может привести к путанице, если с более сложным объектом придется иметь дело.

Однако мы можем отформатировать наш вывод с помощью методаprettyPrint:

String json = generator.toJson(account)
println JsonOutput.prettyPrint(json)

И мы получаем форматированный JSON ниже:

{
    "value": 15.6,
    "createdAt": "01/01/2018",
    "id": "123"
}

3. Разбор JSON в Groovy объекты

Мы собираемся использовать класс GroovyJsonSlurper для преобразования из JSON вObjects..

Кроме того, сJsonSlurper у нас есть несколько перегруженных методовparse и несколько специальных методов, таких какparseText,parseFile, и другие.

Мы будем использоватьparseText для разбораString вAccount class:

def jsonSlurper = new JsonSlurper()

def account = jsonSlurper.parseText('{"id":"123", "value":15.6 }') as Account

В приведенном выше коде у нас есть метод, который получает JSONString и возвращает объектAccount, которым может быть любой объект Groovy.

Кроме того, мы можем разобрать JSONString наMap,, вызывая его без приведения типов, а с помощью динамической типизации Groovy мы можем получить то же самое, что и объект.

3.1. Разбор ввода JSON

Реализация парсера по умолчанию дляJsonSlurper -JsonParserType.CHAR_BUFFER, но в некоторых случаях нам придется иметь дело с проблемой синтаксического анализа.

Давайте посмотрим на пример: учитывая JSONString со свойством даты,JsonSlurper не будет правильно создавать объект, потому что он попытается проанализировать дату какString:

def jsonSlurper = new JsonSlurper()
def account
  = jsonSlurper.parseText('{"id":"123","createdAt":"2018-01-01T02:00:00+0000"}') as Account

В результате приведенный выше код вернет объектAccount со всеми свойствами, содержащими значенияnull.

Чтобы решить эту проблему, мы можем использоватьJsonParserType.INDEX_OVERLAY.

В результате он будет максимально стараться избежать создания массивовString или char:

def jsonSlurper = new JsonSlurper(type: JsonParserType.INDEX_OVERLAY)
def account
  = jsonSlurper.parseText('{"id":"123","createdAt":"2018-01-01T02:00:00+0000"}') as Account

Теперь приведенный выше код вернет должным образом созданный экземплярAccount.

3.2 Parser Variants

Кроме того, внутриJsonParserType, есть другие реализации:

  • JsonParserType.LAX позволит более расслабленный синтаксический анализ JSON с комментариями, без кавычек и т. д.

  • JsonParserType.CHARACTER_SOURCE используется для анализа больших файлов.

4. Заключение

Мы рассмотрели большую часть обработки JSON в приложении Groovy с помощью пары простых примеров.

Для получения дополнительной информации о классах пакетовgroovy.json мы можем взглянуть наGroovy Documentation.

Проверьте исходный код классов, используемых в этой статье, а также некоторых модульных тестов в нашемGitHub repository.