Lavorare con JSON in Groovy

1. Introduzione

In questo articolo descriveremo e vedremo esempi di come lavorare con JSON in un'applicazione Groovy.

Prima di tutto, per ottenere gli esempi di questo articolo attivi e funzionanti, dobbiamo impostare il nostro pom.xml :

  // ...  org.codehaus.gmavenplus gmavenplus-plugin 1.6     // ...  org.codehaus.groovy groovy-all 2.4.13  

Il plugin Maven più recente può essere trovato qui e l'ultima versione di groovy-all qui.

2. Analisi di oggetti Groovy in JSON

La conversione di oggetti in JSON in Groovy è piuttosto semplice, supponiamo di avere una classe Account :

class Account { String id BigDecimal value Date createdAt }

Per convertire un'istanza di quella classe in una stringa JSON , dobbiamo usare la classe JsonOutput ed effettuare una chiamata al metodo statico toJson ():

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

Di conseguenza, otterremo la stringa JSON analizzata :

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

2.1. Personalizzazione dell'output JSON

Come possiamo vedere, l'output della data non è quello che volevamo. A tale scopo, a partire dalla versione 2.5, il pacchetto groovy.json viene fornito con un set di strumenti dedicato.

Con la classe JsonGenerator , possiamo definire opzioni per l'output JSON:

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

Di conseguenza, otterremo il JSON formattato senza il campo del valore che abbiamo escluso e con la data formattata:

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

2.2. Formattazione dell'output JSON

Con i metodi sopra abbiamo visto che l'output JSON era sempre su una singola riga e può creare confusione se un oggetto più complesso deve essere gestito.

Tuttavia, possiamo formattare il nostro output utilizzando il metodo prettyPrint :

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

E otteniamo il muggito JSON formattato:

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

3. Analisi di JSON in oggetti Groovy

Useremo la classe Groovy JsonSlurper per convertire da JSON a oggetti.

Inoltre, con JsonSlurper abbiamo un sacco di metodi di analisi sovraccaricati e alcuni metodi specifici come parseText , parseFile e altri.

Useremo il parseText per analizzare una stringa in una classe Account:

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

Nel codice sopra, abbiamo un metodo che riceve una stringa JSON e restituisce un oggetto Account , che può essere qualsiasi oggetto Groovy.

Inoltre, possiamo analizzare una stringa JSON in una mappa, chiamandola senza alcun cast, e con la digitazione dinamica Groovy, possiamo avere lo stesso oggetto.

3.1. Analisi dell'input JSON

L'implementazione del parser predefinito per JsonSlurper è JsonParserType.CHAR_BUFFER , ma in alcuni casi dovremo affrontare un problema di analisi.

Diamo un'occhiata a un esempio per questo: data una stringa JSON con una proprietà date, JsonSlurper non creerà correttamente l'oggetto perché proverà ad analizzare la data come String:

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

Di conseguenza, il codice precedente restituirà un oggetto Account con tutte le proprietà contenenti valori null .

Per risolvere questo problema, possiamo utilizzare JsonParserType.INDEX_OVERLAY.

Di conseguenza, cercherà il più possibile di evitare la creazione di array di stringhe o caratteri:

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

Ora, il codice sopra restituirà un'istanza di account creata in modo appropriato.

3.2 Varianti di parser

Inoltre, all'interno di JsonParserType, abbiamo alcune altre implementazioni:

  • JsonParserType.LAX consentirà un'analisi JSON più rilassata, con commenti, senza stringhe di virgolette, ecc.
  • JsonParserType.CHARACTER_SOURCE viene utilizzato per l'analisi di file di grandi dimensioni.

4. Conclusione

Abbiamo coperto gran parte dell'elaborazione JSON in un'applicazione Groovy con un paio di semplici esempi.

Per ulteriori informazioni sulle classi del pacchetto groovy.json , possiamo dare un'occhiata alla documentazione di Groovy.

Controlla il codice sorgente delle classi utilizzate in questo articolo, così come alcuni unit test, nel nostro repository GitHub.