将JSON转换为Groovy解析器

22

我发现很多关于将Groovy转换为JSON的内容,但奇怪的是,没有关于反过来的。

那么目前最好的 JSON to Groovy 解析器是什么?

5个回答

36
如果您使用的是Groovy 1.8或更高版本,则可以使用内置的JsonSlurper。如下所示:
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在某些JSON文档中由于正则表达式的过度使用和Java正则表达式实现中的注意事项而导致堆栈溢出异常。请参见http://jira.codehaus.org/browse/GROOVY-4903(标记为已修复,但问题仍然存在)。 - Saulius Žemaitaitis
3
JsonSlurper 也无法从 JSON 中反序列化日期,这真的很烦人。 - erturne
1
@erturne 这可能与日期不是JSON标准的一部分有关。如果您获取的JSON具有new Date()或其他非标准语法,则需要子类化JsonSlurper,否则您只需迭代并修复返回的映射即可。 - Tobia

14

由于编译后的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”? - Gank
1
@Gank mapper 是来自 Jackson 库的 com.fasterxml.jackson.databind.ObjectMapper 实例。 - Dónal

6

JSON-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

它会让你在下载依赖项(ezmorph、commons lang、commons logger)的马拉松中追逐你,一旦你解决了所有问题,你就会得到这个:

主线程异常 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
我在文档上看到了这个,所以应该按照预期工作,但是对我来说却不起作用。 - Gzorg
你运行过 GJson.enhanceClasses() 吗? - nes1983

4

我在 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()

此时,您需要使用“new JsonSlurper().parseText”而不是使用“new JsonSlurper().parse”。 - sourcerebels

3

对于在json-lib和GJson.enhanceClasses()中遇到困难的人,请尝试使用GJson.enhanceString()。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接