2009-12-10 13 views
18

Ho trovato molte cose sulla conversione di Groovy in JSON, ma stranamente, non nell'altro modo.parser da JSON a Groovy

Qual è il (migliore) parser JSON in Groovy in giro?

risposta

12

Poiché le classi Groovy compilate sono compatibili con classi Java, si dovrebbe essere in grado di utilizzare qualsiasi libreria Java per la conversione di JSON per POJO (o Pogos). Jackson è una scelta piuttosto popolare che è possibile utilizzare per convertire JSON in questo modo:

String json = '{ 
    "name" : { "first" : "Joe", "last" : "Sixpack" }, 
    "gender" : "MALE", 
    "verified" : false, 
    "userImage" : "Rm9vYmFyIQ==" 
}' 

ad una mappa utilizzando:

Map<String,Object> userData = mapper.readValue(json, Map.class) 

Oppure, se si desidera convertire il JSON a una classe Utente Groovy:

User userData = mapper.readValue(json, User.class) 

Questo mapperà le proprietà nella classe Groovy alle chiavi nel JSON.

6

JSON-lib afferma di essere in grado di trasformare POGO a JSON e ritorno. Se POGO significa quello che penso che faccia (Plain Old Groovy Object), sei impostato :).

danno questo esempio:

def strAsJsonObject = "{integer:1, bool: true}" as JSONObject 

Aggiornamento:

ho provato io stesso lib, questo è il codice completo:

import net.sf.*; 
import net.sf.json.*; 
import net.sf.json.groovy.*; 

println "hi" 
GJson.enhanceClasses() 
def strAsJsonObject = "{integer:1, bool: true}" as JSONObject 
println strAsJsonObject 

Sarà inseguirti attraverso una maratona di download delle dipendenze (ezmorph, commons lang, commons logger) e una volta risolti tutti, questo è ciò che ottieni:

Exception in thread "main" org.codehaus.groovy.runtime.typehandling.GroovyCastException: non può lanciare l'oggetto '{intero: 1, bool: true}' con classe 'java.lang.String' alla classe 'net.sf.json.JSONObject'

Secondo The mailing list, si ottiene questo per non chiamare GJsonlib.enhanceClasses(), ma mi hai chiamato che, come potete vedere qui sopra.

Ho concluso che è uno sforzo utile per odiare il JSON-lib di Groovy.

+0

Ciò produce un errore di trasmissione. Ho capito che la sintassi 'obj as JSONObject' converte in realtà un oggetto Groovy in JSON. – Gzorg

+0

L'ho visto sul documento, quindi dovrebbe funzionare come previsto, ma non funziona per me. – Gzorg

+0

Hai eseguito GJson.enhanceClasses()? – nes1983

4

Io uso JSON-lib in HTTPBuilder, ma io uso la classe JSONSlurper per analizzare una stringa a un'istanza JSON:

JSON jsonMapObject = new JsonSlurper().parse("{integer:1, bool: true}"); 

Per passare da Object a JSON, faccio questo:

//from a map: 
new JSONObject().putAll([one:'1', two:'two']).toString() 
//from an object: 
JSONObject.fromObject(somePOGO).toString() 
+0

A questo punto, è necessario utilizzare "new JsonSlurper(). ParseText" invece di utilizzare "new JsonSlurper(). Parse" – sourcerebels

3

Per le persone che hanno problemi con json-lib e GJson.enhanceClasses(). Prova invece GJson.enhanceString().

GJson.enhanceString() 
def o = "{\"x\": 20.0}" as JSONObject 
+0

GJson.enhanceString() aiuta – squiddle

33

Se si è su Groovy 1.8 o versione successiva, esiste una build in JsonSlurper che è possibile utilizzare in questo modo:

import groovy.json.JsonSlurper 

//Attention: you have to use double quotes inside the json string 
def jsonObj = new JsonSlurper().parseText('{ "name":"Peter", "age": 23}') 

assert jsonObj.name == "Peter" 
assert jsonObj.age == 23 
//this won't work, because it's not defined 
assert jsonObj.gender == null 
+1

JSONSlurper causa effettivamente eccezioni StackOverflow su alcuni documenti JSON a causa dell'uso liberale di espressioni regolari e avvertimenti nell'implementazione di regexp di Java. Vedi http://jira.codehaus.org/browse/GROOVY-4903 (contrassegnato come corretto ma il problema è ancora presente) –

+3

JsonSlurper inoltre non deserializza le date da JSON, che è davvero fastidioso. – erturne

+1

@erturne che potrebbe avere qualcosa a che fare con Data che non fa parte dello standard JSON. Se il JSON che stai ricevendo ha 'new Date()' o un'altra sintassi non-standand, dovrai sottoclassi JsonSlurper, altrimenti puoi semplicemente iterare e correggere la mappa restituita. – Tobia