7

Grails / Groovyアプリを作成していますが、 paramsメンバー内に変更可能な「文字列」名(グロメットウィジェット)のJSONオブジェクトがあります。つまり、次回はacmezoomになる可能性があります。JSONは次のとおりです。

def jx = """{ 
    "job": "42",
    "params": {
        "grommet": {"name": "x", "data": "y"},
        "widget": { "name": "a", "data": "b"}
    } 
}"""

文字列グロメットを取得する方法を理解しようとしています。これまでのコード:

def dalist = new JsonSlurper().parseText(jx)
println dalist.job     // Gives: 42
println dalist.params  // Gives: [grommet:[name:x, data:y], widget:[name:a, data:b]]
println dalist.params[0]  // Gives: null

文字列グロメットを取得する方法はありますか?イアマは壁に頭をぶつけ続けます。

4

3 に答える 3

9

JSONオブジェクトのparamsキーは、配列ではなくJSONオブジェクトに関連付けられているため、インデックスでアクセスすることはできません。JsonSlurperはJSONオブジェクトをGroovyMapsにマップするためparams、キーを使用してアクセスできます。キーは文字列であり、たとえばdalist.params.grommet、マップを提供します[name: 'x', data: 'y']

上のキーにアクセスするには、paramsを実行できますdalist.params.keySet()。これにより、リストが表示され['grommet', 'widget']ます。paramsキーを知ることに興味があるなら、それでうまくいくはずです。'grommet'何らかの理由で文字列を取得する必要がある場合は、そのリストの最初の要素にアクセスすることで取得できます。つまりdalist.params.keySet()[0]、なぜそれを知りたいのかわかりません。'grommet'また、JSONオブジェクトは仕様によって順序付けされていないため(json.orgから:オブジェクトは名前と値のペアの順序付けられていないセットであるため)、そのマップの最初のキーが常にであることが保証されているかどうかはわかりませんが、次に、Groovyマップ順序付けられています(デフォルトの実装はLinkedHashMapです)...したがって、JSONをGroovyの世界に解析するときに順序が保持されると思いますが、その特定の動作に依存しないようにします。

于 2012-06-16T05:19:00.600 に答える
4

それはMapインスタンスです、試してみてください:

def params = dalist.params.entrySet() as List  // entrySet() returns Set, but it's easier to use it as a List
println params
println params.size()
println params[0]
println params[0].key
println params[0].value
于 2012-06-16T05:16:30.550 に答える
2

これはあなたを助けるかもしれません。

import groovy.json.JsonSlurper;
def jx='{"job":"42","params":{"grommet":{"name":"x","data":"y"},"widget":{"name":"a","data":"b"}}}'

def dalist = new JsonSlurper().parseText( jx )

assert dalist.params.getClass().name == "java.util.HashMap";
assert dalist.params.size() == 2;

def keys = dalist.params.collect{ a, b -> a}; // returns "[grommet, widget]"
assert !!dalist.params.get( "grommet" ) == true
于 2012-06-16T05:34:51.187 に答える