29

groovy から始めた Tcl 開発者として、groovy でのリストとマップのサポートに少し驚いています。多分私はここで何かを逃しています。

私は、文字列、リスト、および配列/マップを tcl でオンザフライで変換することに慣れています。Tclでは、次のようなもの

"['a':2,'b':4]".each {key, value -> println key + " " + value}

groovy の場合と同様に、 each コマンドは文字列の各文字をステップ実行します。

split コマンドや tokenize コマンドなどを簡単に使用できるため、これは大きな問題になりますが、シリアル化されたリストまたはマップは単なる「a:2,b:4」ではないため、解析が少し難しくなります。

griffon の開発者は stringToMap ライブラリ ( http://code.google.com/p/stringtomap/ ) を使用しているようですが、この例ではシリアル化されたマップも処理できません。

だから私の質問は今です: groovy でマップまたはリストを解析する最良の方法は何ですか?

乾杯、ラルフ

PS:それはグルーヴィーな質問ですが、URLを介してマップを渡したいgrailsにはこの機能が必要なので、grailsでタグ付けしました

更新:これは私にとってまだ未解決の質問です...同じ問題を抱えている人のための更新があります:

  • マップを文字列に変換すると、 a.toString()は、すべての場合にマップに戻すことができない結果になりますが、 は.inspect()マップに評価できる文字列を提供します!
  • Grails には.encodeAsJSON()andがありJSON.parse(String)ます - どちらもうまく機能しますが、パーサーが JSON 関数で何をするかはまだ確認していません (セキュリティ上の問題の可能性があります)。
4

5 に答える 5

30

evaluateを使用していくつかのシナリオを試してみたいと思うかもしれません。探していることができるかもしれません。

def stringMap = "['a':2,'b':4]"
def map = evaluate(stringMap)

assert map.a == 2
assert map.b == 4

def stringMapNested = "['foo':'bar', baz:['alpha':'beta']]"
def map2 = evaluate(stringMapNested)

assert map2.foo == "bar"
assert map2.baz.alpha == "beta"
于 2010-02-06T17:14:14.407 に答える
3

ConfigObjectと ConfigSlurperの組み合わせを探していると思います。このようなものがうまくいくでしょう。

def foo = new ConfigObject()
foo.bar = [ 'a' : 2, 'b' : 4 ]

// we need to serialize it
new File( 'serialized.groovy' ).withWriter{ writer ->
  foo.writeTo( writer )
}

def config = new ConfigSlurper().parse(new File('serialized.groovy').toURL())    

// highest level structure is a map ["bar":...], that's why we need one loop more
config.each { _,v ->
    v.each {key, value -> println key + " " + value}
}
于 2010-02-06T09:53:27.610 に答える