Parsing and producing JSON

2018-03-27  本文已影响0人  坚持到底v2

文档

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 方法,以及一些特殊方法,如 parseTextparseFile 等。
下面的示例中使用的是 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字符串没有被格式化
你可以使用 JsonOutputprettyPrint 方法,该方法可以接收任意的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的方式是使用 JsonBuilderStreamingJsonBuilder

上一篇下一篇

猜你喜欢

热点阅读