Groovy技术问询:基于Map键名生成含date属性的JSON方法
解决Groovy生成指定格式JSON的问题
你的问题出在collect的用法上:原代码会对输入Map的每个键生成一个包含date和当前键的子数组,最终得到的是二维数组,而不是预期的一维对象数组。
修正思路
- 先初始化一个列表,把固定的
date对象放进去 - 遍历输入Map的所有键,将每个键转换为
[name: 键名]的对象,追加到列表中 - 最后将这个一维列表转成JSON
修正后的代码
import groovy.json.JsonOutput // 测试第一种Map def convertedMap1 = [sessionCampaignName: 'renins_KASKO_May23', sessionMedium: 'Yandex_banners', sessionSource: 'Media'] // 测试第二种Map def convertedMap2 = [sessionCampaignName: 'olv_May23', sessionTerm: 'greatjob'] def generateDimensionsJson(Map inputMap) { // 初始化列表,先加入date对象 def dimensionsList = [[name: 'date']] // 遍历Map的键,添加每个维度对象 inputMap.each { key, value -> dimensionsList << [name: key] } // 转成格式化的JSON(如果需要压缩可以去掉prettyPrint) return JsonOutput.prettyPrint(JsonOutput.toJson(dimensionsList)) } // 测试输出 println "第一种Map生成的JSON:" println generateDimensionsJson(convertedMap1) println "\n第二种Map生成的JSON:" println generateDimensionsJson(convertedMap2)
输出结果
第一种Map的输出:
[ { "name": "date" }, { "name": "sessionCampaignName" }, { "name": "sessionMedium" }, { "name": "sessionSource" } ]
第二种Map的输出:
[ { "name": "date" }, { "name": "sessionCampaignName" }, { "name": "sessionTerm" } ]
补充说明
如果不需要格式化的JSON,直接用JsonOutput.toJson(dimensionsList)即可生成压缩版的JSON字符串。
内容的提问来源于stack exchange,提问作者fujidaon
相关产品推荐
相关产品推荐

