最近处理Jenkins自动化编译,自己手动写了个打包脚本,需要对Json进行操作。
Json反序列化
由于在gradle文件中无法调用外部Gson,所以采用groovy自带的Json处理
导包
1
| import groovy.json.JsonSlurper
|
使用
1
| def outJsonConfig = new JsonSlurper().parseText(jsonStr)
|
jsonStr的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| { "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
导包
1
| import groovy.json.JsonBuilder
|
使用
1 2 3 4 5 6
| 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
1 2 3 4 5 6 7 8 9 10
| { "message": "ok", "content": { "important": false, "version": "xxxxxx", "code": 28, "url": "AndroidFiles/xxxxxxxx.apk" }, "state": 0 }
|
JsonOutput
导包
1
| import groovy.json.JsonOutput
|
使用
1
| def json = JsonOutput.toJson(appConfigObj)
|
得到的Json
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "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吧