30

我正在尝试将 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作为标识符而不是字符串进行评估时,调用会阻塞。

所以,我的具体问题:

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

2 回答 2

68

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"}')
于 2013-01-10T22:05:13.533 回答
5

您可以使用myMap.toMapString()

于 2013-10-23T19:31:51.873 回答