如何用Groovy创建JSON对象并追加到已有JSON文件?
解决Groovy中JSON文件追加新条目的问题
核心解决方案
你已经将原始JSON和新生成的内容都解析为Groovy的LazyMap(Map的实现类),只需将新条目合并到原始Map中,再重新生成格式化JSON即可。以下是修正后的完整代码:
import groovy.json.* def number = 2 def name = "demo-2" def createdAt = "15:00 PM" def owner = "bhowma" def db_name = "DB2" // 加载原始JSON文件为Map def jsonSlurper = new JsonSlurper() def originalMap = jsonSlurper.parse(new File('/tmp/sarva.json')) // 直接构造新的stack条目Map def newStackMap = [ "stack-$number": [ name: name, createdAt: createdAt, owner: owner, dbName: db_name ] ] // 合并Map:将新条目追加到原始Map originalMap.putAll(newStackMap) // 生成格式化的JSON字符串 def mergedJson = JsonOutput.prettyPrint(JsonOutput.toJson(originalMap)) // 打印合并结果 println(mergedJson) // 将结果写回文件(可选,覆盖原文件) new File('/tmp/sarva.json').write(mergedJson)
关键优化点
- 去掉冗余解析步骤:无需用
JsonBuilder生成JSON再用JsonSlurper解析,直接构造Groovy Map更高效。 - Map合并逻辑:
putAll()方法会将新Map的所有键值对添加到原始Map中,新键(如stack-2)会直接追加,重复键则会覆盖(适合需要更新现有条目的场景)。 - 格式化输出:使用
JsonOutput.prettyPrint()保证输出JSON的格式与预期一致,可读性更强。 - 支持多条目追加:如果需要添加多个新条目,只需构造包含多个键值对的Map,再调用
putAll()即可。
预期输出
执行代码后,会得到与你需求一致的合并JSON:
{ "stack-1": { "name": "demo", "createdAt": "11:00 PM", "owner": "sarva", "dbName": "DB" }, "stack-2": { "name": "demo-2", "createdAt": "15:00 PM", "owner": "bhowma", "dbName": "DB2" } }
内容的提问来源于stack exchange,提问作者Sarva
相关产品推荐
相关产品推荐

