将groovy映射序列化为带引号的字符串
Posted
技术标签:
【中文标题】将groovy映射序列化为带引号的字符串【英文标题】:Serializing groovy map to string with quotes 【发布时间】:2012-12-25 10:12:51 【问题描述】:我正在尝试将 groovy 映射保存到文件中。我目前的尝试是写出字符串表示形式,然后将其读回并在我准备好再次使用它时调用evaluate
以重新创建地图。
我遇到的问题是地图的toString()
方法从元素的值中删除了重要的引号。当我的代码调用评估时,它抱怨未知标识符。
这段代码演示了这个问题:
m = [a: 123, b: 'test']
print "orig: $m\n"
s = m.toString()
print " str: $s\n"
m2 = evaluate(s)
print " new: $m2\n"
前两个打印语句几乎可以工作——但是键 b
的值周围的引号消失了。它不显示[a: 123, b: 'test']
,而是显示[a: 123, b: test]
。
此时损坏已完成。 evaluate
调用在尝试将 test
评估为标识符而不是字符串时阻塞。
所以,我的具体问题:
-
有没有更好的方法在 Groovy 中序列化/反序列化地图?
有没有办法用正确的引号生成地图的字符串表示形式?
【问题讨论】:
【参考方案1】:Groovy 提供了inspect()
方法将对象作为可解析字符串返回:
// serialize
def m = [a: 123, b: 'test']
def str = m.inspect()
// deserialize
m = Eval.me(str)
另一种将 groovy 映射序列化为可读字符串的方法是使用 JSON:
// serialize
import groovy.json.JsonBuilder
def m = [a: 123, b: 'test']
def builder = new JsonBuilder()
builder(m)
println builder.toString()
// deserialize
import groovy.json.JsonSlurper
def slurper = new JsonSlurper()
m = slurper.parseText('"a": 123, "b": "test"')
【讨论】:
为人们剪切和粘贴添加 def ;).inspect()
对于调试代码和将示例映射提取到单元测试中非常有帮助。我在你的未来看到了很多赞成票。
看起来.inspect
需要安全批准。 Scripts not permitted to use staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods inspect java.lang.Object.
【参考方案2】:
您可以使用myMap.toMapString()
【讨论】:
以上是关于将groovy映射序列化为带引号的字符串的主要内容,如果未能解决你的问题,请参考以下文章