我发现很多关于将Groovy转换为JSON的内容,但奇怪的是,没有关于反过来的。
那么目前最好的 JSON to Groovy 解析器是什么?
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
由于编译后的Groovy类与Java类兼容,因此您应该能够使用任何Java库将JSON转换为POJOs(或POGOs)。Jackson是一个相当流行的选择,您可以使用它来像这样转换JSON:
String json = '{
"name" : { "first" : "Joe", "last" : "Sixpack" },
"gender" : "MALE",
"verified" : false,
"userImage" : "Rm9vYmFyIQ=="
}'
使用以下方式将其转换为 Map:
Map<String,Object> userData = mapper.readValue(json, Map.class)
或者,如果您想将JSON转换为Groovy用户类:
User userData = mapper.readValue(json, User.class)
这将把Groovy类中的属性映射为JSON中的键。
在上面的代码中,mapper
是Jackson库中com.fasterxml.jackson.databind.ObjectMapper
的实例。
mapper
是来自 Jackson 库的 com.fasterxml.jackson.databind.ObjectMapper
实例。 - DónalJSON-lib声称可以将POGO转换为JSON并进行反向转换。如果POGO的意思是我认为的那样(Plain Old Groovy Object),那么你就做到了:)。
他们给出了这个例子:
def strAsJsonObject = "{integer:1, bool: true}" as JSONObject
更新:
我已经尝试过这个库,这是完整的代码:
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
主线程异常 org.codehaus.groovy.runtime.typehandling.GroovyCastException: 无法将类为'java.lang.String'的对象'{integer:1, bool:true}'转换为类'net.sf.json.JSONObject'
根据邮件列表,如果没有调用GJsonlib.enhanceClasses(),就会出现这种情况,但我已经调用了,如上所示。
我得出结论,讨厌Groovy的JSON-lib是值得的。
obj as JSONObject
语法实际上是将 Groovy 对象转换为 JSON。 - Gzorg我在 HTTPBuilder 中使用JSON-lib,但我使用JSONSlurper类将字符串解析为JSON实例:
JSON jsonMapObject = new JsonSlurper().parse( "{integer:1, bool: true}" );
将对象转换为JSON,我这样做:
//from a map:
new JSONObject().putAll( [one:'1', two:'two']).toString()
//from an object:
JSONObject.fromObject( somePOGO ).toString()
对于在json-lib和GJson.enhanceClasses()中遇到困难的人,请尝试使用GJson.enhanceString()。
GJson.enhanceString()
def o = "{\"x\": 20.0}" as JSONObject
new Date()
或其他非标准语法,则需要子类化JsonSlurper,否则您只需迭代并修复返回的映射即可。 - Tobia