Groovy解析JSON后List输出无引号问题求助(环境:Groovy2.4.16等)
问题分析
你遇到的情况其实是Groovy中String和List默认toString()行为的正常表现。当你直接打印String对象时,它只会输出字符串的内容本身,不会自动添加引号;而List的toString()方法是遍历所有元素并调用它们的toString(),所以整个List的输出也不会包含引号。你看到的示例里带引号的输出,大概率是JSON格式的序列化结果,而不是直接打印List对象的结果。
解决方案
根据你的需求(保持List类型,同时输出/使用带引号的元素),分两种场景处理:
场景1:只是打印输出时需要带引号
如果你只是希望在日志中看到带引号的格式,但List本身的元素还是原始的字符串值,可以用JsonOutput工具类把List序列化为JSON字符串,这样输出就会包含引号,同时原List的类型和内容不受影响:
import groovy.json.JsonOutput def sout = new StringBuilder('{"vms":["Jenkins","UbuntuRunner"]}') def serr = new StringBuilder() def soutJson = new groovy.json.JsonSlurper().parseText(sout.toString()) def List myList = soutJson.vms // 用JsonOutput生成带引号的JSON格式字符串 log.append("soutJson: " + JsonOutput.toJson(soutJson) + "\n") log.append("myList: " + JsonOutput.toJson(myList) + "\n") log.append("myList[0]: " + JsonOutput.toJson(myList[0]) + "\n") log.append("myList[1]: " + JsonOutput.toJson(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
场景2:后续代码需要List中的元素本身就是带引号的字符串
如果你的后续逻辑需要List里的每个元素都是包含引号的字符串(比如元素值是"Jenkins"而不是Jenkins),可以在解析后对List进行转换,给每个元素添加引号:
def sout = new StringBuilder('{"vms":["Jenkins","UbuntuRunner"]}') def serr = new StringBuilder() def soutJson = new groovy.json.JsonSlurper().parseText(sout.toString()) // 给每个元素添加双引号 def List myList = soutJson.vms.collect { "\"$it\"" } // 此时直接打印就会带引号 log.append("myList: " + myList + "\n") log.append("myList[0]: " + myList[0] + "\n") log.append("myList[1]: " + myList[1] + "\n")
输出结果:
myList: ["Jenkins", "UbuntuRunner"] myList[0]: "Jenkins" myList[1]: "UbuntuRunner"
这种方式下,List的类型依然是List<String>,只是每个元素的内容包含了引号。
关键说明
- Groovy中直接打印
String或List时,默认不会添加引号,这是正常的对象toString行为,不是解析JSON的问题。 - 如果你需要JSON格式的输出,
JsonOutput是最可靠的方式,它能保证输出符合JSON规范的带引号格式。 - 如果需要修改List元素本身的内容,
collect方法可以快速完成转换,同时保持List类型不变。
内容的提问来源于stack exchange,提问作者Kenny Cason
相关产品推荐
相关产品推荐

