You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins JSON Parser给含对象的字段值加双引号的问题求助

解决Jenkins JSON解析器错误包裹对象字段的问题

问题分析

你的场景是Jenkins处理JSON时,错误地将params字段的JSON对象值包裹成了带转义的字符串(比如"params":"{\"commands\":[...]}"),而不是直接保留为JSON对象结构。以下是几种可行的修复方案:


方案1:正则表达式快速修复

适合结构简单的JSON,通过正则匹配并替换错误的包裹格式:

实现逻辑

  1. 匹配"params":"..."格式的字段
  2. 提取内部的转义字符串,将\"还原为"
  3. 重新拼接成"params":{...}的正确格式

Groovy脚本示例

def faultyJson = '{"method":"get","uut":{"password":"extron","ip":"10.113.90.120","username":"admin"},"conn_id":"2f01acb3sf03es4478sa5eds0c184d0f851e","params":"{\"commands\":[{\"ack_token\":\"\",\"name\":\"fullupdaterequest\",\"params\":{}}]}","command":"rawgm"}'

// 正则替换修复
def fixedJson = faultyJson.replaceAll(/"params":"(.*?)"/) { match ->
    // 还原内部的转义双引号
    def innerContent = match[1].replaceAll(/\\"/, '"')
    "\"params\":$innerContent"
}

println(fixedJson)

方案2:JSON解析器反序列化修复(更可靠)

正则在复杂嵌套JSON场景下容易出错,使用官方JSON解析器处理更稳妥:

实现逻辑

  1. 解析错误的JSON字符串为Map对象
  2. 将params字段的字符串值反序列化为JSON对象
  3. 重新生成正确的JSON字符串

Groovy脚本示例

import groovy.json.JsonSlurper
import groovy.json.JsonBuilder

def faultyJson = '{"method":"get","uut":{"password":"extron","ip":"10.113.90.120","username":"admin"},"conn_id":"2f01acb3sf03es4478sa5eds0c184d0f851e","params":"{\"commands\":[{\"ack_token\":\"\",\"name\":\"fullupdaterequest\",\"params\":{}}]}","command":"rawgm"}'

// 解析错误JSON为对象
def jsonSlurper = new JsonSlurper()
def jsonObject = jsonSlurper.parseText(faultyJson)

// 把params的字符串值反序列化为JSON对象
jsonObject.params = jsonSlurper.parseText(jsonObject.params)

// 生成正确的JSON
def jsonBuilder = new JsonBuilder(jsonObject)
def fixedJson = jsonBuilder.toPrettyString()

println(fixedJson)

方案3:从根源避免问题(推荐)

这个错误通常是重复序列化导致的:比如先把params的对象手动转成字符串,再将整个主对象序列化,导致params被二次包裹。

修正示例

错误写法(手动序列化params):

// 错误:提前把commands对象序列化为字符串
def commandsStr = new JsonBuilder(commandsObj).toString()
def mainObj = [
    method: "get",
    params: commandsStr, // 这里传入的是字符串,不是对象
    uut: uutObj,
    conn_id: connId,
    command: "rawgm"
]
def finalJson = new JsonBuilder(mainObj).toString()

正确写法(直接传入对象):

// 正确:直接传入commands对象,让JSONBuilder统一序列化
def mainObj = [
    method: "get",
    params: commandsObj, // 传入原始对象
    uut: uutObj,
    conn_id: connId,
    command: "rawgm"
]
def finalJson = new JsonBuilder(mainObj).toString()

内容的提问来源于stack exchange,提问作者FrankL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:05:55