Groovy JSON缺少字符串引号

问题描述

(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"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...