前言
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)