2016-11-16 7 views
0

"jsonFieldName"という変数に格納されている値の場所を使用して、JSON配列の応答から名前値 "Acura"を抽出しようとしています。JSONSlurperを使用してJSON配列の応答をgroovyで実行する方法

以下は、私がスクリプトを実行するたびに、SOAPUIがエラーを返したときに、これを実行しようとしているコードです。 "java.lang.NullPointerException:ヌルオブジェクトのエラー: 156 "

これを行う方法を親切に助言できますか?

import groovy.json.JsonSlurper 
def response = '''{ 
"makes": [ 
{ 
    "id": 200002038, 
    "name": "Acura", 
    "niceName": "acura", 
    "models": [ 
    { 
     "id": "Acura_ILX", 
     "name": "ILX", 
     "niceName": "ilx", 
     "years": [ 
     { 
      "id": 200471908, 
      "year": 2014 
     } 
     ] 
    }, 
    { 
     "id": "Acura_ILX_Hybrid", 
     "name": "ILX Hybrid", 
     "niceName": "ilx-hybrid", 
     "years": [ 
     { 
      "id": 200493809, 
      "year": 2014 
     } 
     ] 
    }, 
    { 
     "id": "Acura_MDX", 
     "name": "MDX", 
     "niceName": "mdx", 
     "years": [ 
     { 
      "id": 200465929, 
      "year": 2014 
     } 
     ] 
    }, 
    { 
     "id": "Acura_RDX", 
     "name": "RDX", 
     "niceName": "rdx", 
     "years": [ 
     { 
      "id": 200467168, 
      "year": 2014 
     } 
     ] 
    }, 
    { 
     "id": "Acura_RLX", 
     "name": "RLX", 
     "niceName": "rlx", 
     "years": [ 
     { 
      "id": 100539511, 
      "year": 2014 
     } 
     ] 
    }, 
    { 
     "id": "Acura_TL", 
     "name": "TL", 
     "niceName": "tl", 
     "years": [ 
     { 
      "id": 200488448, 
      "year": 2014 
     } 
     ] 
    }, 
    { 
     "id": "Acura_TSX", 
     "name": "TSX", 
     "niceName": "tsx", 
     "years": [ 
     { 
      "id": 200490517, 
      "year": 2014 
     } 
     ] 
    }, 
    { 
     "id": "Acura_TSX_Sport_Wagon", 
     "name": "TSX Sport Wagon", 
     "niceName": "tsx-sport-wagon", 
     "years": [ 
     { 
      "id": 200673755, 
      "year": 2014 
     } 
     ] 
    } 
    ] 
}, 
{ 
    "id": 200001769, 
    "name": "Aston Martin", 
    "niceName": "aston-martin", 
    "models": [ 
    { 
     "id": "Aston_Martin_DB9", 
     "name": "DB9", 
     "niceName": "db9", 
     "years": [ 
     { 
      "id": 200473436, 
      "year": 2014 
     } 
     ] 
    }, 
    { 
     "id": "Aston_Martin_Rapide_S", 
     "name": "Rapide S", 
     "niceName": "rapide-s", 
     "years": [ 
     { 
      "id": 200460643, 
      "year": 2014 
     } 
     ] 
    }, 
    { 
     "id": "Aston_Martin_V8_Vantage", 
     "name": "V8 Vantage", 
     "niceName": "v8-vantage", 
     "years": [ 
     { 
      "id": 200472947, 
      "year": 2014 
     } 
     ] 
    }, 
    { 
     "id": "Aston_Martin_Vanquish", 
     "name": "Vanquish", 
     "niceName": "vanquish", 
     "years": [ 
     { 
      "id": 200431313, 
      "year": 2014 
     } 
     ] 
    } 
    ] 
} 
], 
"makesCount": 2 
}''' 

def jsonFieldName = ('makes[0].name') 
def json = new JsonSlurper().parseText (response) 
jsonFieldName.split("\\.").each{json = json[it]} 

assert json == 'Acura' 

答えて

0

あなたjsonSlurper()コールの最後に.textを追加してみてください(printを呼び出して確認してください)あなたのJSONレスポンスから良いと仮定すると、あなたがそうparseText(response) の間にスペースを持っているようにそれはまた見え

私はにキャストしようとするだろうが、それは

def json = new JsonSlurper().parseText(response)

する必要があります
json.get('Acura')

0

をあなたのコードのこの行は、インデックスの解像度処理されません:とはキーがありません

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

を呼び出すその後
ArrayList<LazyMap> json = new JsonSlurper().parseText(response) as ArrayList<LazyMap>

で繰り返すことができます確保するmakes[0]。代わりにmakesの配列があり、最初のものに興味があります。次のハードコーディングされた行は、名前属性を取得します。

def result = json.'makes'[0].'name' 

ここでは、索引演算子を解決する追加の手順があります。もちろん、この機能を独自に実装することもできますし、JsonSlurperの代わりにJsonPathを使用することもできます。

0

OKこれでJsonSlurperの代わりにJsonPathを使用してこの作業を行うことができました。これを実現するために

は、私は次のようにインポートする必要がありました:

輸入com.jayway.jsonpath.JsonPath

def jsonFieldName = "makes[0].name" 
def expectedValue = "Acura" 
def jsonSuff = JsonPath.read(response, jsonFieldName) 
log.info(jsonSuff) 
if (jsonSuff.toString() == expectedValue.toString()){ 
    log.info("Actual value"+jsonSuff+"is equal to expected value"+expectedValue) 
} 
関連する問題