Jenkins JSON Parser给含对象的字段值加双引号的问题求助
解决Jenkins JSON解析器错误包裹对象字段的问题
问题分析
你的场景是Jenkins处理JSON时,错误地将params字段的JSON对象值包裹成了带转义的字符串(比如"params":"{\"commands\":[...]}"),而不是直接保留为JSON对象结构。以下是几种可行的修复方案:
方案1:正则表达式快速修复
适合结构简单的JSON,通过正则匹配并替换错误的包裹格式:
实现逻辑
- 匹配
"params":"..."格式的字段 - 提取内部的转义字符串,将
\"还原为" - 重新拼接成
"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解析器处理更稳妥:
实现逻辑
- 解析错误的JSON字符串为Map对象
- 将
params字段的字符串值反序列化为JSON对象 - 重新生成正确的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
相关产品推荐
相关产品推荐

