2013-01-10 19 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" 

最初の2つの印刷ステートメントは、ほとんど仕事 - しかし、キーbの値の前後に引用符がなくなっています。 [a: 123, b: 'test']を表示する代わりに、[a: 123, b: test]と表示されます。

この時点でダメージが掛かっています。は、文字列ではなく識別子としてtestを評価しようとすると、チョークを呼び出します。

だから、私の具体的な質問:

  1. はGroovyで/デシリアライズマップをシリアル化するためのより良い方法はありますか?
  2. 適切な引用符でマップの文字列表現を生成する方法はありますか?読み込み可能な文字列がJSONであるよう

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

    グルーヴィーなマップをシリアル化する別の方法を::

答えて

43

Groovyはinspect()方法が解析可能な文字列としてオブジェクトを返す提供

// 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

人を切断して貼り付けるためのdefを追加;) – orbfish

2

することができます使用myMap.toMapString()

+0

'myMap.toMapStri ng() 'も引用符を削除します... – s0undt3ch

関連する問題