将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映射序列化为带引号的字符串的主要内容,如果未能解决你的问题,请参考以下文章

C# - Web API - 将枚举序列化为带空格的字符串

JSONKit 不反序列化不带引号的属性

将JSON字符串反序列化为指定的.NET对象类型

列出随机预定义的贵重物品(不带引号)

JSON.NET 将对象 序列化为 JSON字符串时,能否指定,某个属性不被转化。

Python如何将单引号转换为双引号以格式化为json字符串