【问题标题】:Groovy JSON is missing quotes around stringsGroovy JSON 在字符串周围缺少引号
【发布时间】:2020-09-18 23:24:06
【问题描述】:

(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 作为输入的代码将不起作用。而且不能是字符串,必须是List。

如何保留引号?

【问题讨论】:

  • 解析后你只有一个地图和数组。如果你想以 json 格式打印这些对象,你可以使用 JsonBuilder 或 JsonOutput。 println groovy.json.JsonOutput.toJson(soutJson)
  • @daggett 这将是一个很好的答案
  • 我尝试使用 JsonOutput 并返回一个字符串(尽管带有引号)。我认为我需要的不是字符串,而是 List 对象。我会尝试 JsonBuilder 看看是否有帮助。感谢您的建议。
  • @KennyCason,json 是一种文本格式。所以它是一个字符串。当你解析它时,你得到了 Map/List。当你格式化它时 - 你得到了 json 格式的字符串。您可以尝试生成 JSONObject/JSONArray 的 json.org 解析器 - 并且这些对象上的 toString() 会自动将它们转换为带引号的 json-formatted-string 等...

标签: json groovy double-quotes single-quotes jsonslurper


【解决方案1】:

JsonSlurper().parseText() 在 Groovy 中使用 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 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2021-11-04
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2022-01-18
    相关资源
    最近更新 更多