2009-12-10 16 views

Respuesta

12

Dado que las clases compiladas de Groovy son compatibles con las clases de Java, debería poder utilizar cualquier biblioteca de Java para convertir JSON en POJO (o POGO). Jackson es una opción bastante popular que se puede utilizar para convertir JSON como esto:

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

a un mapa usando:

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

O si lo desea convertir el JSON para una clase de usuario maravilloso:

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

Esto asignará las propiedades en la clase Groovy a las claves en el JSON.

6

JSON-lib afirma que es capaz de transformar POGO en JSON y viceversa. Si POGO significa lo que creo que es (Plain Old Groovy Object), estás listo :).

que dan este ejemplo:

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

actualización:

he probado el mismo lib, este es el código 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 

él se puede perseguir a través de un maratón de descargas de dependencias (ezmorph, commons lang, commons logger) y una vez que los hayas resuelto todos, esto es lo que obtienes:

Excepción en hilo "principal" org.codehaus.groovy.runtime.typehandling.GroovyCastException: No se puede convertir el objeto '{número entero: 1, bool: true}' con la clase 'java.lang.String' a la clase 'net.sf.json.JSONObject'

según The mailing list, se consigue esto para no llamar GJsonlib.enhanceClasses(), pero me has llamado que, como se puede ver arriba.

He llegado a la conclusión de que vale la pena odiar la JSON-lib de Groovy.

+0

Eso produce un error de yeso. Entendí que la sintaxis 'obj como JSONObject' en realidad convierte un objeto Groovy en JSON. – Gzorg

+0

Luego lo vi en el documento, por lo que debería funcionar como estaba previsto, pero no funciona para mí. – Gzorg

+0

¿Ha ejecutado GJson.enhanceClasses()? – nes1983

4

que utilizan la biblioteca JSON en HTTPBuilder, pero yo uso la clase JSONSlurper a analizar una cadena a una instancia de JSON:

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

continuar a partir de objetos para JSON, hago esto:

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

En este momento, es necesario utilizar "nueva JsonSlurper(). ParseText" en lugar de utilizar "nueva JsonSlurper(). Analizar" – sourcerebels

3

Para las personas que tienen problemas con json-lib y GJson.enhanceClasses(). Pruebe GJson.enhanceString() en su lugar.

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

GJson.enhanceString() ayuda – squiddle

33

Si está en Groovy 1.8 o posterior, hay una acumulación de JsonSlurper se puede utilizar de esta manera:

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 realmente causa excepciones StackOverflow en algunos documentos JSON debido al uso liberal de expresiones regulares y advertencias en la implementación de expresiones regulares de Java. Consulte http://jira.codehaus.org/browse/GROOVY-4903 (marcado como fijo pero el problema sigue presente) –

+3

JsonSlurper tampoco deserializa las fechas de JSON, lo cual es realmente molesto. – erturne

+1

@erturne que puede tener algo que ver con que Date no forme parte del estándar JSON. Si el JSON que está obteniendo tiene 'new Date()' u otra sintaxis no estándar, deberá subclasificar JsonSlurper, de lo contrario, puede iterar y corregir el mapa devuelto. – Tobia