美文网首页
Parsing and producing JSON

Parsing and producing JSON

作者: 坚持到底v2 | 来源:发表于2018-03-27 14:41 被阅读0次

    文档

    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

    相关文章

      网友评论

          本文标题:Parsing and producing JSON

          本文链接:https://www.haomeiwen.com/subject/gefscftx.html