【问题标题】:How to update JSON payload when values are embedded in backslash in Groovy如何在 Groovy 的反斜杠中嵌入值时更新 JSON 有效负载
【发布时间】:2021-10-22 21:17:50
【问题描述】:

在 Groovy 中,我必须更新 JSON 有效负载中的值并进行 API 调用。由于字段嵌入在反斜杠中,我在更新有效负载时遇到了挑战。是否有一种更简单的方法可以直接更新以下有效负载中的服务器,即更新 1. JSON 负载2。更新 JSON 负载(更新名称和主机值)。

1. JSON 负载:

    {
    "environment": "dev",
    "config": "Create",
    "configType": "Server",
    "ServerName": "",
    "Servers": "[\\{\"name\":\"Server-test_1\",\"host\":\"test.com\",\"port\":\"443\",\"tls\":\"2-way\"}]",
    "tsHost": "",
    "tsPort": "",
    "tsSSLOption": "1-way"
    }

2。更新的 JSON 负载:

    {
    "environment": "dev",
    "config": "Update",
    "configType": "Server",
    "ServerName": "",
    "Servers": "[\\{\"name\":\"Server-test_2\",\"host\":\"test123.com\",\"port\":\"443\",\"tls\":\"2-way\"}]",
    "tsHost": "",
    "tsPort": "",
    "tsSSLOption": "1-way"
    }

在下面尝试(在转换过程中丢失反斜杠):

代码:

    def json = $/ {
    "environment": "dev",
    "config": "Create",
    "configType": "Server",
    "ServerName": "",
    "Servers": "[\\{\"name\":\"Server-test_1\",\"host\":\"test.com\",\"port\":\"443\",\"tls\":\"2-way\"}]",
    "tsHost": "",
    "tsPort": "",
    "tsSSLOption": "1-way"
    } 
/$
    def parser = new JsonSlurper()
    def jsonResp = parser.parseText(json)
    println(jsonResp.Servers)
    jsonResp.Servers.name = "Server-test_2"
    jsonResp.Servers.host = "test123.com"

【问题讨论】:

  • 这些字段没有嵌入到反斜杠中。反斜杠转义以下字符。见Introducing JSON, string
  • 你能发布你的 Groovy 代码吗?另外为什么大括号前有转义字符?如果您发布 Groovy 代码,我将为您解决问题。但要清楚反斜杠只是转义字符。另外,这是在詹金斯还是只是时髦?你的标签上写着 Jenkins
  • 我第二个克里斯。如果这是在 Jenkins 中,它属于哪个项目类型?
  • @ChrisMaggiulli 我在管道中使用 groovy 脚本来实现一个功能。 (这只是 groovy,很抱歉造成混淆)。 API 需要有效载荷中发布的格式的数据。用代码部分中的代码更新了帖子。
  • 您遇到了问题,因为 servers 属性的值是一个字符串,而不是一个 json 对象数组。您需要将字符串转换为 json 对象数组,然后才能像 json 一样与它进行交互。它与转义字符无关。然后,根据 API,您可能需要将其转换回字符串,此时应为您管理转义字符。也就是说,如果我对你的理解是正确的,我仍然不能 100% 确定

标签: jenkins groovy jenkins-groovy groovyshell groovy-console


【解决方案1】:

Servers 是您初始 json 中的一个字符串 - 您必须解析它

import groovy.json.*

def json = $/ {
    "environment": "dev",
    "config": "Create",
    "configType": "Server",
    "ServerName": "",
    "Servers": "[{\"name\":\"Server-test_1\",\"host\":\"test.com\",\"port\":\"443\",\"tls\":\"2-way\"}]",
    "tsHost": "",
    "tsPort": "",
    "tsSSLOption": "1-way"
    } 
/$
def parser = new JsonSlurper()
def jsonResp = parser.parseText(json)
println(jsonResp.Servers)

def servers = parser.parseText(jsonResp.Servers)
servers[0].name="Server-test_2"
servers[0].host="test123.com"
jsonResp.Servers = JsonOutput.toJson(servers)
json = JsonOutput.prettyPrint(JsonOutput.toJson(jsonResp))

【讨论】:

  • 准确地说(对于 OP):在此答案的代码中,Servers 是一个字符串,其中包含 array [...] 的定义,其中包含一个 JSON 对象 {...} 作为唯一元素。但是问题代码中转义的反斜杠是什么?出错了?
  • 你是对的。我们没有任何信息 1-st json 来自哪里。如果它只是一个静态数据 - 肯定是错字。
  • 谢谢@daggett。与开发团队合作并修改了有效负载。
猜你喜欢
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
相关资源
最近更新 更多