2016-09-30 2 views
1

は私が呼び出していますAPIから次のようなJSONファイルを持っている:PythonのトップレベルのJSON指数

{ 
    "14500": [ 
    { 
     "5": { 
     "versionName": "VersionOne", 
     "expand": "executionSummaries", 
     "name": "Regression", 
     "projectId": 15006, 
     "startDate": "", 
     "executionSummaries": { 
      "executionSummary": [] 
     } 
     }, 
     "7": { 
     "versionName": "VersionOne", 
     "expand": "executionSummaries", 
     "versionId": 14500, 
     "projectId": 15006, 
     "startDate": "19/Sep/16", 
     "executionSummaries": { 
      "executionSummary": [] 
     } 
     }, 
     "-1": { 
     "versionName": "VersionOne", 
     "expand": "executionSummaries", 
     "name": "Ad hoc", 
     "modifiedBy": "", 
     "projectId": 15006, 
     "startDate": "", 
     "executionSummaries": { 
      "executionSummary": [] 
     } 
     }, 
     "recordsCount": 3 
    } 
    ], 
    "14501": [ 
    { 
     "-1": { 
     "versionName": "Version 2", 
     "expand": "executionSummaries", 
     "projectId": 15006, 
     "startDate": "", 
     "executionSummaries": { 
      "executionSummary": [] 
     } 
     }, 
     "recordsCount": 1 
    } 
    ], 
} 

を私はトップレベルを反復処理する必要があり、次のレベル(例:「14500」、および "。 5 "、" 7 "など)を使用してキーと値を検索します。たとえば、JSONファイル全体を検索して、 "回帰"と一致する名前を見つけ、 "ProjectID"と他の文字列のデータセットのセットを探し出す必要があります。私はこれまでdata ["level1"] [0] ["level2"]などを使ってこれを行っていましたが、この場合の数字は決して同じではないので、どのように呼び出すのか分かりません。私はここでいくつかの記事を見て、次のように書いていますが、これはJSONの次のレベルではなく、1つのレベルでしか機能しません。

request = requests.get(getCyclesURL, headers=headers) 
requestData = json.loads(request.text) 
requestDataKeys = requestData.keys 

for k in requestDataKeys(): 
    dictionaryIDs = requestData[k] 
    for m in requestDataKeys: 
     newDictionaryIDs = requestData[k][m] 
     for dict in newDictionaryIDs: 
      if dict['versionName'] == versionName: 
       versionID = dict['versionID'] 
       print '%s: %s'%(versionName, versionID) 
+0

@MMFそれは割り当てのメソッドを呼び出さなかったので、それを行います。 – jonrsharpe

答えて

0

正確な入力に合わせた部分スクリプトです。適切なレベルでname: regressionが見つかると、関連する値のいくつかが表示されます。

for k, list_of_dicts in requestData.items(): 
    for d in list_of_dicts: 
     for k, v in d.items(): 
      if isinstance(v, dict) and v.get('name') == "Regression": 
       print '%s: %s %s'%(v.get('projectId'), 
            v.get('versionName'), 
            v.get('versionId')) 
+0

完璧、ありがとう! – JustMe

0
def find_in_dicts(d, key, value): #This finds all dictionaries that has the given key and value 
    for k, v in d.items(): 
     if k == key: 
      if v == value: 
       yield d 
     else: 
      if isinstance(v, dict): 
       for i in find_in_dicts(v, key, value): 
        yield i 
      elif isinstance(v, list) and isinstance(v[0], dict): 
       for item in v: 
        for i in find_in_dicts(item, key, value): 
         yield i 

これは関係なく、あなたのデータ構造を取得する方法を深くrecursivly動作しないはずです。私は現時点でそれをテストすることができませんが、私はそれがエラストマーであなたにいくつかのアイデアを与えることを願っています。

1

ライブラリーboltonsをチェックしてください。それはあなたのケースでは過剰な可能性がありますが、知って良いことですremap機能があります。ここにあなたのネストされたデータ構造から'name': 'Regression'ですべてdictsを抽出するためのエレガントな方法があります:

from boltons.iterutils import remap 

# Copy your actual data here 
data = {'14500': [{'5': {'name': 'Regression'}, '7': {'name': 'Ad hoc'}}]} 

regressions = [] 

def visit(path, key, value): 
    if isinstance(value, dict) and value.get('name') == 'Regression': 
     # You can do whatever you want here! 
     # If you're here then `value` is a dict 
     # and its `name` field equals to 'Regression'. 
     regressions.append(value) 
    return key, value 

remap(data, visit=visit, reraise_visit=False) 

assert regressions == [{'name': 'Regression'}] 

あなたが唯一の特定のレベルでdictsが必要な場合は、visit機能にpathの長さを確認することができます。

関連する問題