「Groovy」- 常用 JSON 操作(Object 与 JSON)

问题描述

该笔记将记录:在 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