【问题标题】:Serializing groovy map to string with quotes将groovy映射序列化为带引号的字符串
【发布时间】: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 评估为标识符而不是字符串时阻塞。

所以,我的具体问题:

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

【问题讨论】:

    标签: serialization groovy deserialization


    【解决方案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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多