Mit JSON in Groovy arbeiten

Arbeiten mit JSON in Groovy

1. Einführung

In diesem Artikel werden Beispiele für die Arbeit mit JSON in einerGroovy-Anwendung beschrieben und angezeigt.

Um die Beispiele für diesen Artikel zum Laufen zu bringen, müssen wir zunächst unserepom.xml einrichten:


    
        // ...
        
            org.codehaus.gmavenplus
            gmavenplus-plugin
            1.6
        
    


    // ...
    
        org.codehaus.groovy
        groovy-all
        2.4.13
    

Das neueste Maven-Plugin enthälthere und die neueste Version vongroovy-allhere.

2. Analysieren von Groovy-Objekten in JSON

Das Konvertieren von Objekten in JSON in Groovy ist ziemlich einfach. Nehmen wir an, wir haben eineAccount-Klasse:

class Account {
    String id
    BigDecimal value
    Date createdAt
}

Um eine Instanz dieser Klasse in eine JSONString, zu konvertieren, müssen Sie dieJsonOutput-Klasse verwenden und die statische MethodetoJson(): aufrufen

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

Als Ergebnis erhalten wir die analysierten JSONString:

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

2.1. Anpassen der JSON-Ausgabe

Wie wir sehen können, entspricht die Datumsausgabe nicht unseren Wünschen. Zu diesem Zweck enthält das Paketgroovy.json ab Version 2.5 einen speziellen Satz von Tools.

Mit der KlasseJsonGeneratorkönnen wir Optionen für die JSON-Ausgabe definieren:

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

println generator.toJson(account)

Als Ergebnis erhalten wir den formatierten JSON ohne das ausgeschlossene Wertefeld und mit dem formatierten Datum:

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

2.2. Formatieren der JSON-Ausgabe

Mit den obigen Methoden haben wir festgestellt, dass die JSON-Ausgabe immer in einer einzelnen Zeile war und es verwirrend werden kann, wenn ein komplexeres Objekt behandelt werden muss.

Wir können unsere Ausgabe jedoch mit der MethodeprettyPrint formatieren:

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

Und wir bekommen den formatierten JSON-Balg:

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

3. Analysieren von JSON in Groovy-Objekte

Wir werden die Groovy-KlasseJsonSlurper verwenden, um von JSON inObjects. zu konvertieren

Außerdem haben wir mitJsonSlurper eine Reihe überladenerparse-Methoden und einige spezifische Methoden wieparseText,parseFile, und andere.

Wir werdenparseText verwenden, umString inAccount class: zu analysieren

def jsonSlurper = new JsonSlurper()

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

Im obigen Code haben wir eine Methode, die ein JSONString empfängt und einAccount Objekt zurückgibt, das ein beliebiges Groovy-Objekt sein kann.

Außerdem können wir ein JSONString in einMap, analysieren, das es ohne Umwandlung aufruft, und mit der dynamischen Typisierung von Groovy können wir dasselbe wie das Objekt haben.

3.1. Analysieren der JSON-Eingabe

Die Standard-Parser-Implementierung fürJsonSlurper istJsonParserType.CHAR_BUFFER. In einigen Fällen müssen wir uns jedoch mit einem Parsing-Problem befassen.

Schauen wir uns ein Beispiel dafür an: Bei einem JSONString mit einer Datumseigenschaft erstelltJsonSlurper das Objekt nicht korrekt, da versucht wird, das Datum alsString: zu analysieren

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

Infolgedessen gibt der obige Code einAccount-Objekt mit allen Eigenschaften zurück, dienull-Werte enthalten.

Um dieses Problem zu beheben, können wirJsonParserType.INDEX_OVERLAY. verwenden

Infolgedessen wird versucht, die Erstellung vonString oder char-Arrays so weit wie möglich zu vermeiden:

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

Der obige Code gibt nun eine entsprechend erstellteAccount-Instanz zurück.

3.2 Parser Variants

Außerdem haben wir innerhalb derJsonParserType, einige andere Implementierungen:

  • JsonParserType.LAX ermöglicht eine entspanntere JSON-Analyse mit Kommentaren, keinen Anführungszeichen usw.

  • JsonParserType.CHARACTER_SOURCE wird zum Parsen großer Dateien verwendet.

4. Fazit

Wir haben einen Großteil der JSON-Verarbeitung in einer Groovy-Anwendung anhand einiger einfacher Beispiele behandelt.

Weitere Informationen zu den Paketklassen vongroovy.jsonfinden Sie unterGroovy Documentation.

Überprüfen Sie den Quellcode der in diesem Artikel verwendeten Klassen sowie einige Komponententests in unserenGitHub repository.