2016-10-12 5 views
2

は、私が「jsonFieldName」またGroovyを使用してJSON応答から値を抽出するには変数を使用する方法はありますか?

という変数に格納された値の場所を使用してJSONレスポンスから自転車ブランド「キャノンデール」を抽出しようとしている、私は正常に使用してブランド価値を抽出することができますよ次の構文を使用します。

def brand = json.store.bicycle.brand 

ただし、要素の場所を変数に保存したいと考えています。理由は、私はJson Responseで複数のアサーションをオートメーションスイートの一部として反復できるようにしたいということです。

これを行う方法を親切にアドバイスできますか?

以下は、私が現在場所に変数を格納しているスニペットです。しかし、そのが働いて、常に「NULL」としてブランドを返していない:( おかげ

def response = ('''{ 
    "store": { 
    "book": [ 
    { 
     "title": "Sword of Honour", 
     "category": "fiction", 
     "author": "Evelyn Waugh", 
     "@price": 12.99 
    }, 
    { 
     "title": "Moby Dick", 
     "category": "fiction", 
     "author": "Herman Melville", 
     "isbn": "0-553-21311-3", 
     "@price": 8.99 
    }, 
    { 
     "title": "Sayings of the Century", 
     "category": "reference", 
     "author": "Nigel Rees", 
     "@price": 8.95 
    }, 
    { 
     "title": "The Lord of the Rings", 
     "category": "fiction", 
     "author": "J. R. R. Tolkien", 
     "isbn": "0-395-19395-8", 
     "@price": 22.99 
    } 
    ], 
    "bicycle": { 
    "brand": "Cannondale", 
    "color": "red", 
    "price": 19.95 
    } 
} 
}''').toString() 

//store location of json property I want to extract in property called jsonFieldName 
def jsonFieldName = "store.bicycle.brand" 
def json = new JsonSlurper().parseText (response) 
//perform extraction 
brand = json."${jsonFieldName}" 

答えて

0

は、問題は、文字列を使用してプロパティにアクセスすることで、あなたがすることはできませんので、文字列は、プロパティの名前全体と考えられています1つのdepthプロパティ以上にアクセスするためにそれを使用し、他の言葉で.は、プロパティ名の一部と見なされる

周りの可能な作業は.文字で、あなたの文字列を分割し、プロパティを一つずつにアクセスすることができます

def jsonFieldName = "store.bicycle.brand" 
def json = new JsonSlurper().parseText (response) 

jsonFieldName.split("\\.").each{json = json[it]} 

assert json == 'Cannondale' 
3

new JsonSlurper().parseText(response)戻りmap、したがって、あなたがそうでインデックス['bicycle']に最初json['store']で、次に見てみたかった、としながら、json変数にstore.bicycle.brandをという名前のキーを探します"store.bicycle.brand"を検索。

は、私はあなたが欲しいものを行うに inject戦略を使用:

def response = '''{ 
    "store": { 
    "bicycle": { 
    "brand": "Cannondale", 
    "color": "red", 
    "price": 19.95 
    } 
} 
}''' 

def jsonFieldName = "store.bicycle.brand" 
def json = new groovy.json.JsonSlurper().parseText (response) 

get = { field, json2 -> 
    field.tokenize(".").inject(json2) { map, f -> map[f] } 
} 

brand = get jsonFieldName, json 
assert brand == 'Cannondale' 
+0

が実際より機能的なアプローチは、あなたの答えは素敵な1を作ります! – albciff

関連する問題