Groovy中如何定义指定JSON结构的字符串?
在Groovy中创建指定JSON字符串的正确方式
嘿,这个问题我太熟悉了!手动拼接带转义的JSON字符串很容易因为Groovy的字符串特性踩坑,尤其是嵌套结构的时候。给你三种靠谱的解决方案,从简单到优雅任你选:
1. 直接用单引号包裹纯JSON字符串(最简单)
Groovy里的单引号字符串是纯字面量字符串,不会做插值处理,所以内部的双引号完全不需要转义,直接把你的JSON内容放进去就行:
def jsonStr = '{"Changes": [{"Action": "UPSERT", "ResourceRecordSet": { "Name": "rms-collector-demo.cnqr.delivery.","Type": "CNAME","TTL": 300,"ResourceRecords": [{ "Value": "d-4kushcom5y13.execute-api.us-west-2.amazonaws.com"}]}}]}'
2. 双引号字符串的正确转义写法(如果你一定要用双引号)
如果因为某些原因必须用双引号包裹字符串,那你需要把每个内部的双引号用反斜杠\转义——注意Groovy的双引号字符串会做变量插值,所以转义是必须的:
def jsonStr = "{\"Changes\": [{\"Action\": \"UPSERT\", \"ResourceRecordSet\": { \"Name\": \"rms-collector-demo.cnqr.delivery.\",\"Type\": \"CNAME\",\"TTL\": 300,\"ResourceRecords\": [{ \"Value\": \"d-4kushcom5y13.execute-api.us-west-2.amazonaws.com\"}]}}]}"
你之前可能是漏了某个转义,或者没注意双引号字符串的插值特性导致转义失效,不过这种方式可读性差,不推荐。
3. 用Groovy原生JSON工具构建(最优雅,推荐)
Groovy自带了非常方便的JSON构建工具,完全不用管转义,代码结构清晰还容易维护,有两种常用方式:
方式A:使用JsonBuilder
import groovy.json.JsonBuilder def jsonBuilder = new JsonBuilder() jsonBuilder { Changes([ { Action "UPSERT" ResourceRecordSet { Name "rms-collector-demo.cnqr.delivery." Type "CNAME" TTL 300 ResourceRecords([ { Value "d-4kushcom5y13.execute-api.us-west-2.amazonaws.com" } ]) } } ]) } // 得到紧凑格式的JSON字符串 def compactJson = jsonBuilder.toString() // 得到格式化后的易读JSON def prettyJson = jsonBuilder.toPrettyString()
方式B:先构造Map/List,再用JsonOutput转JSON
import groovy.json.JsonOutput def jsonData = [ Changes: [ [ Action: "UPSERT", ResourceRecordSet: [ Name: "rms-collector-demo.cnqr.delivery.", Type: "CNAME", TTL: 300, ResourceRecords: [ [Value: "d-4kushcom5y13.execute-api.us-west-2.amazonaws.com"] ] ] ] ] ] // 生成紧凑JSON def compactJson = JsonOutput.toJson(jsonData) // 生成格式化JSON def prettyJson = JsonOutput.prettyPrint(compactJson)
这两种方式完全规避了手动转义的麻烦,而且结构和JSON一一对应,修改起来特别方便,是Groovy处理JSON的最佳实践。
内容的提问来源于stack exchange,提问作者Kush Arora
相关产品推荐
相关产品推荐

