2016-05-02 7 views
0

私は、Webサービスから引き出し、それを解析しようとしているjsonファイルがあります。私はこの質問が一束として尋ねられたことを知り、私が見つけたものは何でも読んだが、各例のjsonデータは本質的に非常に単純化されているように見える。同様に、pythonのdocsのjsonのサンプルデータはとてもシンプルで、私が扱おうとしているものを反映していません。ここでは、JSONは次のようになります。リストのインデックスをjsonのPythonで

{"RecordResponse": { 
"Id": blah 
"Status": { 
"state": "complete", 
"datetime": "2016-01-01 01:00" 
}, 
"Results": { 
"resultNumber": "500", 
"Summary": [ 
    { 
    "Type": "blah", 
    "Size": "10000000000", 
    "OtherStuff": { 
    "valueOne": "first", 
    "valueTwo": "second" 
    }, 
"fieldIWant": "value i want is here" 

問題のコードブロックは次のとおりです。

jsonFile = r'C:\Temp\results.json' 

with open(jsonFile, 'w') as dataFile: 
    json_obj = json.load(dataFile) 
    for i in json_obj["Summary"]: 
     print(i["fieldIWant"]) 

私は私がしたいフィールドになっていないのですが、私はまた、キーのエラーを取得していますだけでなく、 「要約」を捨てようとしている。

配列内でどのようにインデックスが機能するのかわかりません。 「要約」フィールドに入ると、必要なフィールドから値を返すためにインデックスを手動で発行する必要がありますか?

+2

指定したJSONは無効です。私は間違っていることは何も見せていない。あなたが有効なjsonサンプルを提供できれば、私は個人的に、それがより役に立ちそうです。 – Kelvin

+0

jsonファイルが正しく終了していないことを意味しますか?私はそれがかなり長いので、全体を提供していませんでした。あるいは提示された構造に何か問題があると言っていますか?もしそうなら、それは何ですか? – auslander

答えて

0

投稿した例は有効なJSON(オブジェクトフィールドの後にカンマはありません)なので、あまり掘り下げるのは難しいです。それがウェブサービスからまっすぐだと、何かがうんざりしています。あなたは適切なカンマでそれを修正しなかった場合、あなたは全く構造がわからない場合は

with open(jsonFile, 'w') as dataFile: 
    json_obj = json.load(dataFile) 
    for i in json_obj["Results"]["Summary"]: 
     print(i["fieldIWant"]) 

にあなたのループを変更する必要があると思いますので、「概要」キーは、「結果」オブジェクト内にあります結果のオブジェクトを再帰的に調べることができます。

def findfieldsiwant(obj, keyname="Summary", fieldname="fieldIWant"): 
    try: 
     for key,val in obj.items(): 
     if key == keyname: 
      return [ d[fieldname] for d in val ] 
     else: 
      sub = findfieldsiwant(val) 
      if sub: 
       return sub 
    except AttributeError: #obj is not a dict 
     pass 
    #keyname not found 
    return None 
+0

申し訳ありませんが、あまりにも速く入力していました。私はjsonの例を修正しました。 – auslander

+0

これは助けになりました。これは 'RecordResults'の中にある' Results'の中にあります。 json_obj ["RecordResults"] ["Results"] ["Summary"] 'の中で私が言ったら、それは私に必要な値を与えました。助けてくれてありがとう! – auslander