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全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Groovy代码示例 – JSON
JSON解析与生成 groovy支持json的解析与生成,使用groovy.json包提供的功能很容易实现groovy类与json之间的映射。 JsonSlurper JsonSlurper 是用于解析JSON数……
<<上一篇
下一篇>>
文章目录
关闭
目 录