作为从 groovy 开始的 tcl 开发人员,我对 groovy 中的列表和 map 支持感到有些惊讶。也许我在这里遗漏了一些东西。
我习惯于在 tcl 中动态地在字符串、列表和数组/映射之间进行转换。在 tcl 中,类似
"['a':2,'b':4]".each {key, value -> println key + " " + value}
是可能的,在 groovy 中, each 命令会遍历字符串的每个字符。
这将是一个很大的问题,因为我可以轻松地使用诸如 split 或 tokenize 命令之类的东西,但是因为序列化列表或映射不仅仅是“a:2,b:4”,所以解析起来有点困难。
似乎 griffon 开发人员使用 stringToMap 库( http://code.google.com/p/stringtomap/ ),但该示例也无法处理序列化映射。
所以我现在的问题是:在 groovy 中解析 map 或列表的最佳方法是什么?
干杯,
拉尔夫
PS:这是一个很好的问题,但我已经用 grails 标记了它,因为我需要这个功能用于 grails,我想通过 URL 传递 map
更新:这对我来说仍然是一个悬而未决的问题......所以这里有一些更新给那些有同样问题的人:
.toString()
将导致在所有情况下都无法变回 map 的东西,而是 .inspect()
会给你一个字符串,可以评估回 map ! .encodeAsJSON()
和 JSON.parse(String)
- 两者都很好用,但我还没有检查解析器将如何处理 JSON 函数(可能存在安全问题)最佳答案
不完全是原生的 groovy,但对于序列化为 JSON 很有用:
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
def map = ['a':2,'b':4 ]
def s = new JsonBuilder(map).toString()
println s
assert map == new JsonSlurper().parseText(s)
元编程:
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
Map.metaClass.toJson = { new JsonBuilder(delegate).toString() }
String.metaClass.toMap = { new JsonSlurper().parseText(delegate) }
def map = ['a':2,'b':4 ]
assert map.toJson() == '{"a":2,"b":4}'
assert map.toJson().toMap() == map
不幸的是,不可能覆盖 toString() 方法......
关于string - Groovy:没有现成的 stringToMap 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2212606/