0

(Groovy 版本:2.4.16 JVM:11.0.8 供应商:Debian 操作系统: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 作为输入的代码将不起作用。而且不能是字符串,必须是List。

如何保留引号?

4

1 回答 1

2

Groovy 中的JsonSlurper().parseText()以 JSON 对象作为输入,返回实现 Map 接口的org.apache.groovy.json.internal.LazyMap类的实例。存储在 LazyMap 中的 JSON 结构被规范化为原生 Java 原语(不是 JSON 原语),其中 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 库

例子:

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"
于 2020-09-27T15:38:10.897 回答