Trabalhando com JSON no Groovy

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
    

O plugin Maven mais recente pode ser encontradoheree a versão mais recente dogroovy-allhere.

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.