Groovy解析及处理JSON

参考http://groovy-lang.org/json.html

本篇介绍groovy.json package的json处理功能

1. JsonSlurper

JsonSlurper处理json文本,并可以将json内容转换成Groovy数据结构,比如:maps, lists, Integer, Double, Boolean, String等.

parseText方法:

JsonSlurper实现了ECMA-404 JSON Interchange Standard,并且支持JavaScript注释及 Dates.

JsonSlurper也支持将JSON数组转换为lists.

JSON 标准支持以下原始数据类型:string, number, object, true, false, null. JsonSlurper 会将它们转换为对应的 Groovy 类型

JsonSlurper返回Groovy对象, 符合GPath表达式。GPath是一种功能很强的表达式语言,并通过 multiple slurpers 可以支持不同的数据格式,例如:XmlSlurper可以用于处理xml。想了解更多的细节,可以查看GPath表达式这一章节。下面是 JSON 类型与对应的 Groovy 数据类型,对照表:

1.1. 解析器

JsonSlurper实现了一些解析器。这些解析器可以满足某些特定场景下的不同需求:

JsonParserCharArray:将JSON字符串以字符array的方式处理,在处理过程中会拷贝字符的子数组加以处理(这种机制称为:chopping),这是JsonSlurper默认的解析器。

JsonFastParser: 是基于JsonParserCharArray的扩展,它是最快速的解析器。但不是默认解析器,也是有一定原因。JsonFastParser被称为index-overlay解析器。在解析JSON字符串的时候,其尽可能避免创建新的字符数组或字符串, 仅保持其指针在愿字符数组上, 此外, 也尽可能推迟对象的创建)。解析得到的map可能并没有被创建,仅由指向原始char buffer的指针构成,因此在需要long-term cache时必须要小心。JsonFastParser也提供了一种特殊的chop mode模式,可以尽早将char buffer切成小块,以保留原始buffer的小副本。建议在处理2MB以下的JSON数据时使用JsonFastParser,并且要并考虑到long-term cache限制。

JsonParserLax:是JsonParserCharArray解析器的一个特殊变体。它具有与JsonFastParser类似的性能特征,但不同之处在于它不完全依赖于ECMA-404 JSON语法。例如,它允许注释,没有引用字符串等。

JsonParserUsingCharacterSource: 用于处理大文件。它使用称为“字符窗口”的技术来解析大型JSON文件(大型文件大小超过2MB),性能不变

下表中列举了 JsonParserType 与 其实现的对照关系:

可以使用JsonSlurper#setType()来修改JsonParserType的解析器类型

2. JsonOutput

JsonOutput主要用于将Groovy对象序列化为JSON字符串,和JsonSlurper相对应。JsonOutput重载了toJson静态方法,支持不同的参数,返回结果是JSON格式的字符串。

JsonOutput支持原始类型、maps、lists,还可以支持POGOs(plain-old Groovy objects)。

2.1. 自定义output(>=v2.5.0)

JsonGenerator用来自定义output,JsonGenerator.Options采用builder模式实现,可以对output进行订制。

闭包可以用来转换类型。这些闭包转换器是为给定类型注册的,并且在任何时候遇到该类型或子类型时都会被调用。闭包的第一个参数是与转换器注册的类型匹配的对象,并且此参数是必需的。闭包可能需要一个可选的第二个字符串参数,如果有可用的话,它将被设置为键名。

2.1.1. 格式化Output

JsonOutput中的prettyPrint方法将JSON输出格式更漂亮

prettyPrint的参数是一个字符串;因此,它可以应用于任意的JSON字符串实例,而不仅仅是JsonOutput.toJson的结果。

2.2. Builders

Groovy中另一种创建JSON的方法是使用JsonBuilder或StreamingJsonBuilder。两者都提供了一个DSL,允许制定一个对象图,然后将其转换为JSON。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180623G0C14C00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券