Groovy - Konvertiert ein Objekt in eine JSON-Zeichenfolge

74

Ich bin ziemlich an Grails-Konverter gewöhnt, bei denen Sie jedes Objekt wie folgt in eine JSON-Darstellung konvertieren können ( http://grails.org/Converters+Reference ).

return foo as JSON

Aber im einfachen Groovy kann ich keinen einfachen Weg finden, dies zu tun ( http://groovy-lang.org/json.html )

JSONObject.fromObject(this)

Leere JSON-Strings zurückgeben ...

Vermisse ich einen offensichtlichen Groovy-Konverter? Oder sollte ich mich für eine Jackson- oder Gson-Bibliothek entscheiden?

Wavyx
quelle
1
native "groovige Eigenschaften" sind reinen Java-Bibliotheken nicht bekannt (dh Bibliotheken, die an Java Reflection / Java Beans arbeiten)
Jacek Cz

Antworten:

146

Meinst du wie:

import groovy.json.*

class Me {
    String name
}

def o = new Me( name: 'tim' )

println new JsonBuilder( o ).toPrettyString()
tim_yates
quelle
1
Das funktioniert tatsächlich. Aber das Verrückte ist, wenn Sie "public String name" angeben. Wenn Sie einen öffentlichen Accessor verwenden, scheint JsonBuilder diese zu ignorieren ...
Wavyx
@Wavyx Ja, dann schafft es nicht metaClass.properties, also wird es nicht vom Erbauer abgeholt: - /
tim_yates
Ok .. nur andere hässliche Lösungen warendef toJsonString(Boolean prettyPrint = false) { Map props = [:] def outObject = Publication.declaredFields.findAll { !it.synthetic && it.name != 'props' }.collectEntries { v -> [ (v.name):this[v.name] ] } outObject << props String json = JsonOutput.toJson(outObject) prettyPrint ? JsonOutput.prettyPrint(json) : json }
Wavyx
Oder vielleicht:new JsonBuilder( this.getClass().declaredFields.findAll { !it.synthetic }.collectEntries { [ (it.name):this[ it.name ] ] } ).toString()
tim_yates
22

Ich konnte die anderen Antworten nicht in der Evaluierungskonsole in Intellij zum Laufen bringen, also ...

groovy.json.JsonOutput.toJson(myObject)

Das funktioniert ganz gut, aber leider

groovy.json.JsonOutput.prettyString(myObject)

hat bei mir nicht funktioniert.

Um es schön gedruckt zu bekommen, musste ich das tun ...

groovy.json.JsonOutput.prettyPrint(groovy.json.JsonOutput.toJson(myObject))
chim
quelle
9

Sie können dafür JsonBuilder verwenden .

Beispielcode:

import groovy.json.JsonBuilder

class Person {
    String name
    String address
}

def o = new Person( name: 'John Doe', address: 'Texas' )

println new JsonBuilder( o ).toPrettyString()
Dhamibirendra
quelle
7
Bitte geben Sie eine vollständige Antwort an, da diese hilfreicher ist als ein Link zu einer anderen Website. Dieser Link funktioniert nicht mehr.
Antonyh