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

如何用JsonBuilder结合JsonOutput生成无content元素的JSON并转义特殊字符

解决Groovy JsonBuilder + JsonOutput.toJson 多余"content"字段的问题

首先得明白为啥会出现这个多余的content字段:JsonBuilder本身是一个包含内部状态的对象,当你直接把它传给JsonOutput.toJson()时,方法会序列化整个JsonBuilder实例的属性,而不是你实际构建的JSON数据,这就导致了额外的content键出现。

下面给你两种可行的解决办法,都能保留特殊字符转义,同时去掉多余字段:

方法1:直接使用JsonBuilder的content属性

你可以直接取出JsonBuilder里的content对象,再传给JsonOutput.toJson(),这样就只会序列化你实际构建的内容:

import groovy.json.JsonBuilder
import groovy.json.JsonOutput

// 模拟你的XML解析后的数据,包含特殊字符
def xmlData = [
    text: "Hello\nWorld! This is a \"quoted\" string with\t tabs."
]

// 构建JSON
def builder = new JsonBuilder()
builder {
    message xmlData.text
}

// 取出content再转义,避免多余字段
def escapedJson = JsonOutput.toJson(builder.content)
println(escapedJson)

输出会是:

{"message":"Hello\nWorld! This is a "quoted" string with\t tabs."}

完全没有多余的content字段,同时特殊字符也被正确转义了。

方法2:构建时直接返回对象给JsonOutput

如果你不需要保留JsonBuilder实例,也可以直接在构建时把生成的对象传给JsonOutput:

import groovy.json.JsonBuilder
import groovy.json.JsonOutput

def xmlData = [
    text: "Hello\nWorld! This is a \"quoted\" string with\t tabs."
]

// 直接构建对象并转义
def escapedJson = JsonOutput.toJson(new JsonBuilder().with {
    message xmlData.text
    return it.content
})

println(escapedJson)

这个方法和第一种本质一样,只是写法更紧凑,同样能得到正确的转义结果且无多余字段。

补充说明

你提到不能用toString(),其实是因为JsonBuilder.toString()虽然能直接输出JSON字符串,但它的转义逻辑和JsonOutput.toJson()可能不一致,而且对于复杂嵌套结构或者特殊字符的处理可能不够严谨,所以用JsonOutput处理builder.content是更可靠的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:49:55