将groovy map序列化为带引号的字符串

Dou*_*ris 25 groovy serialization deserialization

我正在尝试将groovy地图保存到文件中.我当前的尝试是将字符串表示写出来然后再读回来并evaluate在我准备好再次使用它时调用它来重新创建地图.

我遇到的问题是toString()地图的方法从元素的值中删除了重要的引号.当我的代码调用evaluate时,它会抱怨一个未知的标识符.

此代码演示了此问题:

m = [a: 123, b: 'test']
print "orig: $m\n"

s = m.toString()
print " str: $s\n"

m2 = evaluate(s)
print " new: ${m2}\n"
Run Code Online (Sandbox Code Playgroud)

前两个打印语句几乎可以工作 - 但是关键值的引用b已经消失了.[a: 123, b: 'test']它表明,而不是显示[a: 123, b: test].

此时损坏已经完成.当evaluate调用尝试评估test为标识符而不是字符串时,调用会阻塞.

所以,我的具体问题:

  1. 有没有更好的方法在Groovy中序列化/反序列化地图?
  2. 有没有办法用适当的引号生成地图的字符串表示?

ata*_*lor 58

Groovy提供的inspect()方法将对象作为可解析的字符串返回:

// serialize
def m = [a: 123, b: 'test']
def str = m.inspect()

// deserialize
m = Eval.me(str)
Run Code Online (Sandbox Code Playgroud)

将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"}')
Run Code Online (Sandbox Code Playgroud)

  • 为人们剪切和粘贴添加def;) (3认同)
  • `.inspect()` 对于调试代码和将示例映射提取到单元测试中非常有帮助。我在你的未来看到很多赞成票。 (2认同)
  • 看起来“.inspect”需要安全批准。`脚本不允许使用 staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods 检查 java.lang.Object。` (2认同)

小智 5

您可以使用 myMap.toMapString()