问题描述
该笔记将记录:在 Groovy 中,常用 JSON 操作,以及相关问题处理。
解决方案
Object 转为 JSON
如下代码,可以将对象(List、Map)转化为 Json String:
import groovy.json.JsonOutput println JsonOutput.toJson(dataObject)
但是,如果数据中包含 Unicode 字符,则 toJson() 将对其进行转义。如下示例以及解决方法:
import groovy.json.JsonOutput import groovy.json.JsonGenerator.Options def mapWithUnicode = [key : "好"] println JsonOutput.toJson(mapWithUnicode) // {"key":"\u597d"} println new Options().disableUnicodeEscaping().build().toJson(mapWithUnicode) // {"key":"好"}
在 Jenkins Pipeline 中,使用 JsonGenerator.Options 会提示 unable to resolve class groovy.json.JsonGenerator.Options 错误,因为 Jenkins Pipeline 使用 Groovy 2.4 版本(09/16/2020 Jenkins 2.241)。为了解决该问题,我们需要求助于第三方类库,比如 Gson 库:
@Grab(group='com.google.code.gson', module='gson', version='2.8.2') import com.google.gson.Gson println new Gson().toJson([key : "好"]) // {"key":"好"}
解析 JSON 字符串(JSON 转为 Object)
import groovy.json.JsonSlurperClassic return new JsonSlurperClassic().parseText(jsonString)
常见问题处理
判断返回类型
假如远程 HTTP API 返回 JSON Array([]) 但是在错误时返回 JSON OBJECT({}),这就需要我们判断返回类型:
import groovy.json.JsonSlurperClassic def object = new JsonSlurper().parseText('{ "myList": [4, 8, 15, 16, 23, 42] }') assert object instanceof Map assert object.myList instanceof List // 在正常情况下,因该使用状态码或者接口返回字段来判断,这里仅是特殊场景
参考文献
Parsing and producing JSON
How to parse JSON in Java – Stack Overflow
json – How to use Groovy JsonOutput.toJson with data encoded with UTF-8? – Stack Overflow