前言
Json格式是web开发常用的信息交换格式,规范简单,生成的内容易于理解。
Groovy 中对Json的支持还是比较丰富的,下面我们就一起来看看如何使用Groovy完成常见的Json串解析(序列化)和反解(反序列化)任务。
1. 生成 json 串的几种方法
从简单到复杂,依次是“用 JsonOutput”、“用 JsonBuilder”、“用 JsonStreamBuilder” 方法,以及使用 Java 的 Json 工具库,如 FastJson 生成。
1.1 用 JsonOutput 生成 Json串
当我们有一个 object,需要把它序列化为 json串时,我们可以这样写
ComplexClass object = new ComplexClass()
String jsonString = JsonOutput.toJson(object)
非常的简单,而且我们还可以用 Category 方法让某个类具备 toJson() 方法。
use(JsonOutput) {
ComplexClass object = new ComplexClass()
ComplexClass2 object2 = new ComplexClass2()
String jsonString = object.toJson()
String jsonString2 = object2.toJson()
}
1.2 用 JsonGenerator 更灵活地生成 Json串
如果我们不想让某些属性出现在 json 串中,可以这样写
class TenantStaff {
String userName
String password
Date dateCreated
Date lastUpdated
StringProperty elementNameProperty
ObservableList children
}
def generator = new JsonGenerator.Options()
.excludeFieldsByName('elementNameProperty')
.excludeFieldsByType(Date, ObservableList)
.build()
String jsonString = generator.toJson(object)
assert generator.toJson(person) == '{"userName":"xxx","password":"xxx"}'
但是,如果我们想将对象的属性改个名字,或是取属性对象的属性,那么 JsonGenerator 是无能为力的,需要用 JsonBuilder 来实现。
1.3 用 JsonBuilder 生成 Json 串
【TODO,后面空着的都是 TODO】
1.4 用JsonStreamBuilder 生成 Json 串
2. 解析 Json 串的方法
2.1 用 JsonSlurper 解析 Json 串
2.2 将 json串得到的GroovyObject转换为具体的领域类
2.3 用 FastJson 解析 json串 的方法
思考
如何能在反解 json 串时,更方便地利用 groovy 的 DSL 能力,指定特定属性的转换规则?也许我们可以自己开发一套这样的DSL。
这套DSL可以让我们这样配置和解析 json 串:
DomainClass complexObject = Json.parseRules {
prop.subProp.rule = new DateRule
prop2.rule = { new SpecialClass(it.value) }
}.parse(jsonString)