微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Groovy:是不是有一个stringToMap开箱即用?

作为一个以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()方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐