グルーヴィーなマップをファイルに永続化しようとしています。私の現在の試みは、文字列表現を書き出してから読み込み直し、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"
最初の2つの印刷ステートメントはほぼ機能しますが、キーb
の値を囲む引用符はなくなりました。 [a: 123, b: 'test']
を表示する代わりに、[a: 123, b: test]
を表示します。
この時点で、ダメージはなくなりました。 evaluate
呼び出しは、test
を文字列ではなく識別子として評価しようとすると、窒息します。
だから、私の特定の質問:
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"}')
myMap.toMapString()
を使用できます