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-all
здесь .
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:
{"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
Мы собираемся использовать класс 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.
Кроме того, мы можем преобразовать строку
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 .