web-dev-qa-db-ja.com

グルーヴィーなマップを引用符付きの文字列にシリアル化する

グルーヴィーなマップをファイルに永続化しようとしています。私の現在の試みは、文字列表現を書き出してから読み込み直し、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を文字列ではなく識別子として評価しようとすると、窒息します。

だから、私の特定の質問:

  1. Groovyでマップをシリアライズ/デシリアライズするより良い方法はありますか?
  2. 適切な引用符でマップの文字列表現を生成する方法はありますか?
26
Doug Harris

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"}')
55
ataylor

myMap.toMapString()を使用できます

4
DMoney