作为一个以groovy开始的tcl开发人员,我对groovy中的列表和地图支持感到有点惊讶。也许我在这里遗漏了一些东西。
我习惯于在tcl中的字符串,列表和数组/映射之间进行转换。在tcl中,像
"['a':2,'b':4]".each {key,value -> println key + " " + value}
将是可能的,在groovy中,每个命令遍历字符串的每个字符。
这可能是一个很大的问题,我可以很容易地使用像split或tokenize命令这样的东西,但是由于序列化的列表或地图不仅仅是“a:2,b:4”,所以解析有点困难。
看起来,griffon开发人员使用了一个stringToMap库(http://code.google.com/p/stringtomap/),但该示例也无法应对序列化的地图。
所以我的问题现在是:在groovy中解析地图或列表的最好方法是什么?
干杯,
拉尔夫
PS:这是一个简单的问题,但是我用grails标记了它,因为我需要这个功能,我想通过URL传递地图
更新:这仍然是我的一个开放的问题…所以这里有一些更新为那些谁有同样的问题:
>当您将Map转换为String时,.toString()将导致在所有情况下无法转回地图的东西,但.inspect()将为您提供一个可以被评估回到一张地图!
>在Grails中,有一个.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()方法…