2013-01-10 41 views
16

我試圖將groovy映射保存到文件。我目前的嘗試是寫出字符串表示,然後再讀取它,並在其上調用evaluate以在我準備再次使用它時重新創建地圖。序列化groovy映射到帶引號的字符串

我遇到的問題是地圖的toString()方法會從元素的值中刪除重要的引號。當我的代碼調用評估時,它會抱怨未知的標識符。

此代碼演示了此問題:

m = [a: 123, b: 'test'] 
print "orig: $m\n" 

s = m.toString() 
print " str: $s\n" 

m2 = evaluate(s) 
print " new: ${m2}\n" 

前兩個print語句幾乎工作 - 但圍繞着價值的報價爲重點b都不見了。它不顯示[a: 123, b: 'test'],而是顯示[a: 123, b: test]

此時傷害已完成。當evaluate嘗試評估test作爲標識符而不是字符串時調用扼流圈。

所以,我的具體問題:

  1. 有沒有更好的方式來序列化/ Groovy中去序列化映射?
  2. 有沒有一種方法可以用正確的引號生成地圖的字符串表示?

回答

43

Groovy提供的inspect()方法返回一個對象作爲可解析字符串:作爲可讀的字符串與JSON

// serialize 
def m = [a: 123, b: 'test'] 
def str = m.inspect() 

// deserialize 
m = Eval.me(str) 

另一種方式來序列一個常規地圖:

// 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"}') 
+3

add def's for cutting and pasteing;) – orbfish

2

你可以使用myMap.toMapString()

+0

'myMap.toMapStri ng()'也會刪除引號...... – s0undt3ch

相關問題