Trabalhando com JSON no Groovy
1. Introdução
Neste artigo, vamos descrever e ver exemplos de como trabalhar com JSON em um aplicativoGroovy.
Em primeiro lugar, para colocar os exemplos deste artigo em funcionamento, precisamos configurar nossopom.xml:
// ...
org.codehaus.gmavenplus
gmavenplus-plugin
1.6
// ...
org.codehaus.groovy
groovy-all
2.4.13
2. Analisando objetos Groovy para JSON
Converter objetos em JSON no Groovy é muito simples, vamos supor que temos uma classeAccount:
class Account {
String id
BigDecimal value
Date createdAt
}
Para converter uma instância dessa classe em JSONString,, precisamos usar a classeJsonOutput e fazer uma chamada para o método estáticotoJson():
Account account = new Account(
id: '123',
value: 15.6,
createdAt: new SimpleDateFormat('MM/dd/yyyy').parse('01/01/2018')
)
println JsonOutput.toJson(account)
Como resultado, obteremos o JSONString: analisado
{"value":15.6,"createdAt":"2018-01-01T02:00:00+0000","id":"123"}
2.1. Customizando a Saída JSON
Como podemos ver, a saída de data não é o que queríamos. Para isso, a partir da versão 2.5, o pacotegroovy.json vem com um conjunto dedicado de ferramentas.
Com a classeJsonGenerator, podemos definir opções para a saída JSON:
JsonGenerator generator = new JsonGenerator.Options()
.dateFormat('MM/dd/yyyy')
.excludeFieldsByName('value')
.build()
println generator.toJson(account)
Como resultado, obteremos o JSON formatado sem o campo de valor que excluímos e com a data formatada:
{"createdAt":"01/01/2018","id":"123"}
2.2. Formatando a Saída JSON
Com os métodos acima, vimos que a saída JSON estava sempre em uma única linha e pode ficar confusa se um objeto mais complexo precisar ser tratado.
No entanto, podemos formatar nossa saída usando o métodoprettyPrint:
String json = generator.toJson(account)
println JsonOutput.prettyPrint(json)
E temos o JSON formatado abaixo:
{
"value": 15.6,
"createdAt": "01/01/2018",
"id": "123"
}
3. Analisando JSON para Objetos Groovy
Vamos usar a classe GroovyJsonSlurper para converter de JSON paraObjects.
Além disso, comJsonSlurper, temos vários métodosparse sobrecarregados e alguns métodos específicos, comoparseText,parseFile,e outros.
UsaremosparseText para analisar umString para umAccount class:
def jsonSlurper = new JsonSlurper()
def account = jsonSlurper.parseText('{"id":"123", "value":15.6 }') as Account
No código acima, temos um método que recebe um JSONStringe retorna um objetoAccount, que pode ser qualquer Objeto Groovy.
Além disso, podemos analisar um JSONString para umMap, chamando-o sem qualquer elenco e, com a tipagem dinâmica Groovy, podemos ter o mesmo que o objeto.
3.1. Analisando Entrada JSON
A implementação do analisador padrão paraJsonSlurper éJsonParserType.CHAR_BUFFER, mas em alguns casos, precisaremos lidar com um problema de análise.
Vejamos um exemplo disso: dado um JSONString com uma propriedade de data,JsonSlurper não criará corretamente o objeto porque tentará analisar a data comoString:
def jsonSlurper = new JsonSlurper()
def account
= jsonSlurper.parseText('{"id":"123","createdAt":"2018-01-01T02:00:00+0000"}') as Account
Como resultado, o código acima retornará um objetoAccount com todas as propriedades contendo valoresnull.
Para resolver esse problema, podemos usar oJsonParserType.INDEX_OVERLAY.
Como resultado, ele tentará ao máximo evitar a criação deString ou matrizes de caracteres:
def jsonSlurper = new JsonSlurper(type: JsonParserType.INDEX_OVERLAY)
def account
= jsonSlurper.parseText('{"id":"123","createdAt":"2018-01-01T02:00:00+0000"}') as Account
Agora, o código acima retornará uma instânciaAccount criada apropriadamente.
3.2 Parser Variants
Além disso, dentro deJsonParserType,, temos algumas outras implementações:
-
JsonParserType.LAX permitirá uma análise JSON mais relaxada, com comentários, sem strings de aspas, etc.
-
JsonParserType.CHARACTER_SOURCE é usado para análise de arquivos grandes.
4. Conclusão
Cobrimos muito do processamento JSON em um aplicativo Groovy com alguns exemplos simples.
Para obter mais informações sobre as classes de pacotegroovy.json, podemos dar uma olhada emGroovy Documentation.
Verifique o código-fonte das classes usadas neste artigo, bem como alguns testes de unidade, em nossoGitHub repository.