最近处理 Jenkins 自动化编译,自己手动写了个打包脚本,需要对 Json 进行操作。
# Json 反序列化
由于在 gradle 文件中无法调用外部 Gson,所以采用 groovy 自带的 Json 处理
导包
import groovy.json.JsonSlurper |
使用
def outJsonConfig = new JsonSlurper().parseText(jsonStr) |
jsonStr 的值
{ | |
"version": 1, | |
"artifactType": { | |
"type": "APK", | |
"kind": "Directory" | |
}, | |
"applicationId": "com.xxxx.xxx", | |
"variantName": "huaceDebug", | |
"elements": [ | |
{ | |
"type": "SINGLE", | |
"filters": [], | |
"properties": [], | |
"versionCode": 28, | |
"versionName": "28", | |
"enabled": true, | |
"outputFile": "xxx.debug.v1.0.28.20240619.apk" | |
} | |
] | |
} |
序列化的结果

# Json 序列化
两种方法
# JsonBuilder
导包
import groovy.json.JsonBuilder |
使用
def generator = new JsonGenerator.Options() | |
.excludeFieldsByName('contentHash', 'originalClassName') | |
.build() | |
def jsonBuilder = new JsonBuilder(appConfigObj,generator); | |
def appConfigJson = jsonBuilder.toString() |
这里有一个 JsonGenerator , 主要是因为在将对象序列化成 Json 时会自动生成两个字段 contentHash 和 originalClassName 并且嵌套对象的每一层都会存在
为了去除多余的字段,所以使用 generator 去除

得到的 Json
{ | |
"message": "ok", | |
"content": { | |
"important": false, | |
"version": "xxxxxx", | |
"code": 28, | |
"url": "AndroidFiles/xxxxxxxx.apk" | |
}, | |
"state": 0 | |
} |
# JsonOutput
导包
import groovy.json.JsonOutput |
使用
def json = JsonOutput.toJson(appConfigObj) |
得到的 Json
{ | |
"contentHash": "6f6ffcd51be2a62dbd1311a085f96e46", | |
"originalClassName": "JsonBody", | |
"message": "ok", | |
"content": { | |
"contentHash": "5832596251b548949b3903af6e7712c2", | |
"important": false, | |
"originalClassName": "JsonContent", | |
"version": "pyh.debug.v1.0.28.20240619", | |
"code": 28, | |
"url": "AndroidFiles/pyh.debug.v1.0.28.20240619.apk" | |
}, | |
"state": 0 | |
} |
可以看到有自动生成两个字段 contentHash 和 originalClassName
为了保证数据整洁,还是选用 JsonBuilder 吧