«1. Введение

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

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

<build>
    <plugins>
        // ...
        <plugin>
            <groupId>org.codehaus.gmavenplus</groupId>
            <artifactId>gmavenplus-plugin</artifactId>
            <version>1.6</version>
        </plugin>
    </plugins>
</build>
<dependencies>
    // ...
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.4.13</version>
    </dependency>
</dependencies>

Самый последний подключаемый модуль Maven можно найти здесь, а последнюю версию groovy -все здесь.

2. Преобразование объектов Groovy в JSON

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

class Account {
    String id
    BigDecimal value
    Date createdAt
}

Чтобы преобразовать экземпляр этого класса в строку JSON, мы нужно использовать класс 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)

В результате получим разобранную JSON String:

{"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 Objects

Мы собираемся используйте класс Groovy JsonSlurper для преобразования из JSON в объекты.

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

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

def jsonSlurper = new JsonSlurper()

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

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

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

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

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

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

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

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

Чтобы решить эту проблему, мы можем использовать 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

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

3.2 Варианты парсера

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

    JsonParserType.LAX позволит более расслабленно анализировать JSON, с комментариями, без строк кавычек и т. д. JsonParserType.CHARACTER_SOURCE используется для разбор больших файлов.

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

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

Дополнительную информацию о классах пакета groovy.json можно найти в документации по Groovy.

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