问题描述
(Groovy版本:2.4.16 JVM:11.0.8供应商:Debian OS:Linux)
我的bash shell脚本输出的JSON字符串如下所示(不带“ sout:”):
sout: {"vms":["Jenkins","UbuntuRunner"]}
我将其用作此Groovy代码的输入:
def sout = new StringBuilder()
def serr = new StringBuilder()
// translate JSON to List
def soutJson = new JsonSlurper().parseText(sout.toString())
log.append("sout: " + sout + "\n")
log.append("serr: " + serr + "\n")
log.append("soutJson: " + soutJson + "\n")
def List myList = soutJson.vms
log.append("myList: " + myList + "\n")
log.append("myList[0]: " + myList[0] + "\n")
log.append("myList[1]: " + myList[1] + "\n")
log.append("myList.size(): " + myList.size() + "\n")
我希望输出中包含引号,例如:
soutJson: ["vms":["Jenkins","UbuntuRunner"]]
myList: ["Jenkins","UbuntuRunner"]
myList[0]: "Jenkins"
myList[1]: "UbuntuRunner"
myList.size(): 2
但是实际上的输出缺少引号:
soutJson: [vms:[Jenkins,UbuntuRunner]]
myList: [Jenkins,UbuntuRunner]
myList[0]: Jenkins
myList[1]: UbuntuRunner
myList.size(): 2
我发现每个示例都打印一个列表或列表中的元素包括引号。我不在乎这些是单引号还是双引号,但是如果没有引号,以后将myList作为输入的代码将无法工作。而且它不能是字符串,必须是列表。
如何保留引号?
解决方法
Groovy中的
JsonSlurper().parseText()(带有JSON对象作为输入)返回实现Map接口的org.apache.groovy.json.internal.LazyMap类的实例。 LazyMap中存储的JSON结构被规范化为本地Java原语(不是JSON原语),在Java原语中,String值被本地处理,并且Map上的toString()返回原样的String值,不带引号。
要正确编码JsonSlurper的JSON输出,请使用JsonOutput类,但 JsonOutput.toJson()的返回类型是一个字符串。
import groovy.json.JsonOutput
String json = '{ "vms":["Jenkins","UbuntuRunner"] }'
def soutJson = new JsonSlurper().parseText(json)
String jsonOut = JsonOutput.toJson(soutJson)
println jsonOut
输出:
{"vms":["Jenkins","UbuntuRunner"]}
如果您希望已解析的JSON对象的内部元素作为JSON输出,则建议使用Gson library。
示例:
import com.google.gson.Gson
import com.google.gson.JsonParser
import com.google.gson.JsonObject
String json = '{ "vms":["Jenkins","UbuntuRunner"] }'
def object = JsonParser.parseString(json)
// Or Gson instance and fromJson() method to achieve same result
// def gson = new Gson()
// def object = gson.fromJson(json,JsonObject.class)
println "soutJson: " + object
def myList = object.get('vms')
println "myList: " + myList
println "myList[0]: " + myList[0]
输出:
soutJson: {"vms":["Jenkins","UbuntuRunner"]}
myList: ["Jenkins","UbuntuRunner"]
myList[0]: "Jenkins"