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

时间:2013-01-10 21:45:52

标签: serialization groovy 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"

前两个印刷语句几乎可以正常工作 - 但是密钥b的值附近的引号已经消失。它不显示[a: 123, b: 'test'],而是显示[a: 123, b: test]

此时损坏已经完成。 evaluate调用在尝试将test评估为标识符而非字符串时会阻塞。

所以,我的具体问题:

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

2 个答案:

答案 0 :(得分:49)

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"}')

答案 1 :(得分:4)

您可以使用myMap.toMapString()