Groovy代码示例 – JSON
JSON解析与生成
groovy支持json的解析与生成,使用groovy.json
包提供的功能很容易实现groovy类与json之间的映射。
JsonSlurper
JsonSlurper 是用于解析JSON数据或将其转换为groovy的对象,如:map、list、String、integer等。
该类提供了一系列的parse多态方法还有parseText,parseFile等特殊方法。在下面的例子中,将讲解parseText方法的使用。该方法解析JSON字符串并递归的将其转换成为对象列表、对象map。其他的parse*方法功能上也是类似的,只是参数类型有所不同。
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText('{ "name": "John Doe" } /* some comment */')
assert object instanceof Map
assert object.name == 'John Doe'
上述代码将json转换为map,JsonSlurper支持注释。
对于JSON中的数据类型会被转换成为groovy中的List对象。
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支持以下数据类型:string,number,object,true,false,null。JsonSlurper会将JSON数据类型映射到相对应的groovy类型。
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText '''
{ "simple": 123,
"fraction": 123.66,
"exponential": 123e12
}'''
assert object instanceof Map
assert object.simple.class == Integer
assert object.fraction.class == BigDecimal
assert object.exponential.class == BigDecimal
JSON与Groovy数据类型的对应:
JSON | Groovy |
---|---|
string | String |
number | BigDecimal/Integer |
object | LinkedHashMap |
array | ArrayList |
true | true |
false | false |
null | null |
date | java.util.Date based on the yyyy-MM-dd'T'HH:mm:ssZ date format |
JSON解析类的其他实现
JsonSlurper有一系列的解析实现。每种实现对应着不同的解析需求,默认实现可能对于大多数场景是合适的,但不是对于所有场景都是最佳的。以下是JsonSlurper解析类的其他实现:
- JsonParserCharArray 用户解析JSON字符串。主要针对字符串的字符数组操作。在转化过程中,通过拷贝相对应部分的字符子数组并对其进行类型转化等操作完成JSON的解析。
- JsonFastParser是一个比较特殊的JsonParserCharArray解析实现,是最快的解析方式。但是,他不是默认的解析方式。JsonFastParser 也是被称为“索引覆盖解析器”。在JSON解析过程中,解析器尽可能的避免创建新的字符数组或者字符串。总是指向已有的字符数据。此外,该方式总是尽可能迟的销毁对象。如果被解析的map被放置到长期缓存中,那么这个map对象必须不会被创建,并且还须指向原先的字符缓存。
- JsonParserLax也是一个比较特殊的JsonParserCharArray解析实现。它的性能与JsonFastParser相当。不同的是,它不依赖于ECMA-404 JSON 标准。比如,它允许json中出现注释和没有引号的字符串等。
- JsonParserUsingCharacterSource是适用于大文件的JSON解析器。它使用了 "character windowing" 技术解析JSON大文件 (大文件意味着至少2M以上)从而有着比较稳定的解析性能。
实现类 | 对应常量 |
---|---|
JsonParserCharArray | JsonParserType#CHAR_BUFFER |
JsonFastParser | JsonParserType#INDEX_OVERLAY |
JsonParserLax | JsonParserType#LAX |
JsonParserUsingCharacterSource | JsonParserType#CHARACTER_SOURCE |
要改变解析的实现方式,可以通过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]
Json序列化之JsonOutput
JsonOutput负责将groovy对象序列化为json字符串,跟JsonSlurper刚好相反。
JsonOutput类具有多态的静态json处理方法。每个方法的实现对应不同的参数类型。这些静态方法可以通过静态导入的方式导入后直接使用。
方法的执行结果为JSON格式的字符串。
def json = JsonOutput.toJson([name: 'John Doe', age: 42])
assert json == '{"name":"John Doe","age":42}'
JsonOutput 不仅仅支持数据主类型,map,list等类型的JSON序列化,甚至可以序列化POGOs,也就是普通的Groovy对象。
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()
prettyPrint方法接收字符串参数。该方法不能与其他JsonOutput方法一起使用,只能作用于任意的JSON格式字符串。
Groovy中还有一个方法可以创建JSON,那就是通过JsonBuilder
类或者StreamingJsonBuilder
类。这两个类都提供了DSL语法使得我们可以创建一个对象图,然后转换为JSON。
groovy中如何将对象转化为json?
groovy中将对象转为json的示例代码如下:
import groovy.json.*
class Me {
String name
}
def o = new Me( name: 'tim' )
println new JsonBuilder( o ).toPrettyString() //转为json
groovy中如何将json字符串转为对象?
groovy1.8以后可以使用JsonSlurper将json转化为对象,示例代码如下:
import groovy.json.JsonSlurper
def jsonObj = new JsonSlurper().parseText( '{ "name":"Peter", "age": 23}' )
assert jsonObj.name == "Peter"
assert jsonObj.age == 23
//下面的属性不存在
assert jsonObj.gender == null
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/05/07/groovy-code-example-json/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论