文档
http://www.groovy-lang.org/json.html
Groovy 为 Groovy对象
和 JSON
之间的转换提供了集成支持。
专用于 JSON 序列化
和 解析
的类可以在 groovy.json
包中找到。
1、 JsonSlurper
JsonSlurper
类用于解析JSON文本或将内容读取到Groovy数据结构(objects)中,例如 maps、lists和原始类型(如 Integer、Double、Boolean、String)
JsonSlurper
类重载了很多 parse
方法,以及一些特殊方法,如 parseText
,parseFile
等。
下面的示例中使用的是 parseText
方法。
它解析JSON字符串并递归地将其转换为list或map
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText('{ "name": "John Doe" } /* some comment */')
assert object instanceof Map
assert object.name == 'John Doe'
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText('{ "myList": [4, 8, 15, 16, 23, 42] }')
assert object instanceof Map
assert object.myList instanceof List
assert object.myList == [4, 8, 15, 16, 23, 42]
当JSON中的value为 null
时,JsonSlurper
会提供一个 Groovy null
值。
这区别于其他JSON解析器使用一个单例对象表示 null
值。
1.1. Parser Variants
JsonSlurper附带了一些 parser 的实现。
每个 parser 都适合不同的需求,
对于某些场景,JsonSlurper默认解析器可能不是所有情况下最好的选择。
(1) JsonParserCharArray 在底层字符数组上操作JSON字符串。 在值转换时,它拷贝 字符子数组(该机制被称为 "chopping") 并操作它们。它是默认的解析器
(2) JsonFastParser 是 JsonParserCharArray 的变种,并且是最快的parser,但由于某种原因它不是默认的parser。
JsonFastParser parser 是一个所谓的 index-overlay parser。
当解析给定的 JSON字符串时它尝试 尽可能地避免创建新的字符数组或String实例。
它只保留指向底层原始字符数组的指针。
另外,它会尽可能延迟创建对象。
如果解析的maps被放入 long-term 缓存中时必须要小心,因为映射对象可能不会被创建,并且仍然只包含指向原始字符缓冲区的指针。
但是,JsonFastParser提供了一种特殊的切片模式,可以尽早将字符缓冲区分成多个部分,以保留原始缓冲区的小副本。
建议使用2MB以下的JSON缓冲区的JsonFastParser,并考虑到 long-term 缓存的限制。
(3) JsonParserLax 是 JsonParserCharArray 的变种,它的性能和 JsonFastParser 类似。
不同的是,它不依赖于 ECMA-404 JSON 语法。例如,它允许 注释、不用引号引起来的字符串 等等
(4) JsonParserUsingCharacterSource 适合于解析大的文件。它使用一种被称为"character windowing"的技术解析大的JSON文件(大的 意味着大于 2MB 的文件)
要更改 parser 的实现,可以简单地通过 JsonSlurper#setType()
设置 JsonParserType
def jsonSlurper = new JsonSlurper(type: JsonParserType.INDEX_OVERLAY)
def object = jsonSlurper.parseText('{ "myList": [4, 8, 15, 16, 23, 42] }')
assert object instanceof Map
assert object.myList instanceof List
assert object.myList == [4, 8, 15, 16, 23, 42]
2、 JsonOutput
JsonOutput
负责序列Groovy对象到JSON字符串。
JsonOutput
带有重载的静态 toJson
方法。
每个toJson实现都采用不同的参数类型。
例子:
def json = JsonOutput.toJson([name: 'John Doe', age: 42])
assert json == '{"name":"John Doe","age":42}'
JsonOutput
不只是只支持 原始类型、maps或list,它还支持序列化 POGOs
例子
class Person { String name }
def json = JsonOutput.toJson([ new Person(name: 'John'), new Person(name: 'Max') ])
assert json == '[{"name":"John"},{"name":"Max"}]'
默认情况下,输出的Json字符串没有被格式化
你可以使用 JsonOutput
的 prettyPrint
方法,该方法可以接收任意的JSON 字符串
例子:
def json = JsonOutput.toJson([name: 'John Doe', age: 42])
assert json == '{"name":"John Doe","age":42}'
assert JsonOutput.prettyPrint(json) == '''\
{
"name": "John Doe",
"age": 42
}'''.stripIndent()
3、 其他创建JSON的方式
在Groovy中其他创建JSON的方式是使用 JsonBuilder
或 StreamingJsonBuilder
网友评论