如何用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
相关产品推荐
相关产品推荐

