2013-01-07 46 views
4

我試圖得到一個JSON對象的Python的特定值。我還沒來得及使用類似:Python中的JSON:如何獲取數組的特定部分?

數據[「數據」] [「數據2」]

,以獲取與數據2相關聯的特定值,但是這是一個有點不同,我的JSON文件現在更復雜,這是

{ 
    "data": { 
     "playerStatSummaries": { 
      "playerStatSummarySet": [ 
       { 
        "aggregatedStats": { 
         "stats": [] 
        }, 
        "leaves": 0, 
        "losses": 0, 
        "maxRating": 0, 
        "modifyDate": "/Date(1357567398182)/", 
        "playerStatSummaryType": "Unranked3x3", 
        "rating": 400, 
        "wins": 5 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [] 
        }, 
        "leaves": 0, 
        "losses": 0, 
        "maxRating": 0, 
        "modifyDate": "/Date(1357567398182)/", 
        "playerStatSummaryType": "AramUnranked6x6", 
        "rating": 400, 
        "wins": 0 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [ 
          { 
           "statType": "TOTAL_CHAMPION_KILLS", 
           "value": 68 
          }, 
          { 
           "statType": "TOTAL_ASSISTS", 
           "value": 116 
          }, 
          { 
           "statType": "TOTAL_MINION_KILLS", 
           "value": 1854 
          }, 
          { 
           "statType": "TOTAL_TURRETS_KILLED", 
           "value": 22 
          }, 
          { 
           "statType": "TOTAL_NEUTRAL_MINIONS_KILLED", 
           "value": 359 
          } 
         ] 
        }, 
        "leaves": 0, 
        "losses": 5, 
        "maxRating": 1505, 
        "modifyDate": "/Date(1357261303440)/", 
        "playerStatSummaryType": "RankedSolo5x5", 
        "rating": 1505, 
        "wins": 9 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [ 
          { 
           "statType": "TOTAL_CHAMPION_KILLS", 
           "value": 369 
          }, 
          { 
           "statType": "TOTAL_ASSISTS", 
           "value": 535 
          }, 
          { 
           "statType": "TOTAL_MINION_KILLS", 
           "value": 9917 
          }, 
          { 
           "statType": "TOTAL_TURRETS_KILLED", 
           "value": 78 
          }, 
          { 
           "statType": "TOTAL_NEUTRAL_MINIONS_KILLED", 
           "value": 1050 
          } 
         ] 
        }, 
        "leaves": 0, 
        "losses": 35, 
        "maxRating": 1266, 
        "modifyDate": "/Date(1323496849000)/", 
        "playerStatSummaryType": "RankedTeam5x5", 
        "rating": 1266, 
        "wins": 39 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [ 
          { 
           "statType": "TOTAL_CHAMPION_KILLS", 
           "value": 29 
          }, 
          { 
           "statType": "TOTAL_ASSISTS", 
           "value": 17 
          }, 
          { 
           "statType": "TOTAL_MINION_KILLS", 
           "value": 176 
          }, 
          { 
           "statType": "TOTAL_TURRETS_KILLED", 
           "value": 8 
          }, 
          { 
           "statType": "TOTAL_NEUTRAL_MINIONS_KILLED", 
           "value": 12 
          } 
         ] 
        }, 
        "leaves": 0, 
        "losses": 0, 
        "maxRating": 1200, 
        "modifyDate": "/Date(1326521499000)/", 
        "playerStatSummaryType": "CoopVsAI", 
        "rating": 1200, 
        "wins": 2 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [ 
          { 
           "statType": "TOTAL_CHAMPION_KILLS", 
           "value": 150 
          }, 
          { 
           "statType": "TOTAL_ASSISTS", 
           "value": 184 
          }, 
          { 
           "statType": "TOTAL_MINION_KILLS", 
           "value": 3549 
          }, 
          { 
           "statType": "TOTAL_TURRETS_KILLED", 
           "value": 24 
          }, 
          { 
           "statType": "TOTAL_NEUTRAL_MINIONS_KILLED", 
           "value": 224 
          } 
         ] 
        }, 
        "leaves": 0, 
        "losses": 17, 
        "maxRating": 0, 
        "modifyDate": "/Date(1350098520000)/", 
        "playerStatSummaryType": "RankedTeam3x3", 
        "rating": 1308, 
        "wins": 22 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [ 
          { 
           "statType": "TOTAL_CHAMPION_KILLS", 
           "value": 15 
          }, 
          { 
           "statType": "TOTAL_ASSISTS", 
           "value": 185 
          }, 
          { 
           "statType": "TOTAL_MINION_KILLS", 
           "value": 250 
          }, 
          { 
           "statType": "TOTAL_TURRETS_KILLED", 
           "value": 4 
          }, 
          { 
           "statType": "TOTAL_NEUTRAL_MINIONS_KILLED", 
           "value": 15 
          } 
         ] 
        }, 
        "leaves": 0, 
        "losses": 3, 
        "maxRating": 1365, 
        "modifyDate": "/Date(1321778545000)/", 
        "playerStatSummaryType": "RankedPremade5x5", 
        "rating": 1365, 
        "wins": 8 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [ 
          { 
           "statType": "TOTAL_CHAMPION_KILLS", 
           "value": 672 
          }, 
          { 
           "statType": "AVERAGE_CHAMPIONS_KILLED", 
           "value": 9 
          }, 
          { 
           "statType": "MAX_COMBAT_PLAYER_SCORE", 
           "value": 889 
          }, 
          { 
           "statType": "AVERAGE_OBJECTIVE_PLAYER_SCORE", 
           "value": 771 
          }, 
          { 
           "statType": "MAX_TEAM_OBJECTIVE", 
           "value": 2 
          }, 
          { 
           "statType": "MAX_NODE_CAPTURE", 
           "value": 14 
          }, 
          { 
           "statType": "MAX_OBJECTIVE_PLAYER_SCORE", 
           "value": 1424 
          }, 
          { 
           "statType": "MAX_TOTAL_PLAYER_SCORE", 
           "value": 1950 
          }, 
          { 
           "statType": "AVERAGE_NUM_DEATHS", 
           "value": 10 
          }, 
          { 
           "statType": "TOTAL_DECAYER", 
           "value": 105 
          }, 
          { 
           "statType": "TOTAL_ASSISTS", 
           "value": 931 
          }, 
          { 
           "statType": "AVERAGE_NODE_NEUTRALIZE", 
           "value": 6 
          }, 
          { 
           "statType": "AVERAGE_NODE_CAPTURE_ASSIST", 
           "value": 2 
          }, 
          { 
           "statType": "MAX_NODE_CAPTURE_ASSIST", 
           "value": 5 
          }, 
          { 
           "statType": "MAX_ASSISTS", 
           "value": 25 
          }, 
          { 
           "statType": "AVERAGE_NODE_NEUTRALIZE_ASSIST", 
           "value": 1 
          }, 
          { 
           "statType": "AVERAGE_TOTAL_PLAYER_SCORE", 
           "value": 1182 
          }, 
          { 
           "statType": "MAX_NODE_NEUTRALIZE_ASSIST", 
           "value": 3 
          }, 
          { 
           "statType": "AVERAGE_COMBAT_PLAYER_SCORE", 
           "value": 413 
          }, 
          { 
           "statType": "AVERAGE_NODE_CAPTURE", 
           "value": 8 
          }, 
          { 
           "statType": "MAX_CHAMPIONS_KILLED", 
           "value": 20 
          }, 
          { 
           "statType": "TOTAL_NODE_NEUTRALIZE", 
           "value": 391 
          }, 
          { 
           "statType": "AVERAGE_TEAM_OBJECTIVE", 
           "value": 1 
          }, 
          { 
           "statType": "AVERAGE_ASSISTS", 
           "value": 11 
          }, 
          { 
           "statType": "TOTAL_NODE_CAPTURE", 
           "value": 447 
          }, 
          { 
           "statType": "MAX_NODE_NEUTRALIZE", 
           "value": 11 
          }, 
          { 
           "statType": "MAX_NUM_DEATHS", 
           "value": 16 
          } 
         ] 
        }, 
        "leaves": 0, 
        "losses": 0, 
        "maxRating": 0, 
        "modifyDate": "/Date(1357567398182)/", 
        "playerStatSummaryType": "OdinUnranked", 
        "rating": 400, 
        "wins": 43 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [] 
        }, 
        "leaves": 0, 
        "losses": 0, 
        "maxRating": 0, 
        "modifyDate": "/Date(1357567398182)/", 
        "playerStatSummaryType": "AramUnranked2x2", 
        "rating": 400, 
        "wins": 0 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [] 
        }, 
        "leaves": 0, 
        "losses": 0, 
        "maxRating": 0, 
        "modifyDate": "/Date(1357567398182)/", 
        "playerStatSummaryType": "AramUnranked1x1", 
        "rating": 400, 
        "wins": 0 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [] 
        }, 
        "leaves": 0, 
        "losses": 0, 
        "maxRating": 0, 
        "modifyDate": "/Date(1357567398182)/", 
        "playerStatSummaryType": "AramUnranked3x3", 
        "rating": 400, 
        "wins": 0 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [ 
          { 
           "statType": "TOTAL_CHAMPION_KILLS", 
           "value": 10269 
          }, 
          { 
           "statType": "TOTAL_DECAYER", 
           "value": 0 
          }, 
          { 
           "statType": "TOTAL_ASSISTS", 
           "value": 15722 
          }, 
          { 
           "statType": "TOTAL_MINION_KILLS", 
           "value": 262793 
          }, 
          { 
           "statType": "TOTAL_TURRETS_KILLED", 
           "value": 1954 
          }, 
          { 
           "statType": "TOTAL_NEUTRAL_MINIONS_KILLED", 
           "value": 43898 
          }, 
          { 
           "statType": "TOTAL_DEATHS_PER_SESSION", 
           "value": 1513 
          } 
         ] 
        }, 
        "leaves": 1, 
        "losses": 0, 
        "maxRating": 0, 
        "modifyDate": "/Date(1357567398182)/", 
        "playerStatSummaryType": "Unranked", 
        "rating": 400, 
        "wins": 1691 
       }, 
       { 
        "aggregatedStats": { 
         "stats": [] 
        }, 
        "leaves": 0, 
        "losses": 0, 
        "maxRating": 0, 
        "modifyDate": "/Date(1357567398182)/", 
        "playerStatSummaryType": "AramUnranked5x5", 
        "rating": 400, 
        "wins": 0 
       } 
      ] 
     }, 
     "previousFirstWinOfDay": "/Date(1357489166306)/", 
     "userId": 55060 
    }, 
    "success": true 
} 

正如你可以看到這是很長的,我的問題是,我怎麼會從某個playerStatSummarySet一套搶只有特定的值?就像我們說我只是想抓住從集與playerStatSummaryTypeRankedSolo5x5我該怎麼做評定值?

這裏是我已經打算到目前爲止從JSON文件獲取數據。

with open('data.txt', 'r') as f: 
    data = json.load(f) 
+1

這只是一個'list'。像任何其他使用它。 – Izkata

回答

4
如果你有複雜的JSON對象工作

,我建議你看一看jsonpath,提供xpath像語言json對象。

一個例子:

import jsonpath 
import json 
with open('/test.json', 'r') as f: 
    data = json.load(f) 
path = "$.[?(@.playerStatSummaryType == 'RankedSolo5x5')].rating" 
jsonpath.jsonpath(data,path) 

出來:

[1505] 
+0

謝謝,雖然我的答案有很多解決方案,但這使得它非常方便和易於理解。 –

1

使用列表理解

with open('data.txt', 'r') as f: 
    data = json.load(f) 
rating = [summary["rating"] for summary 
      in data["data"]["playerStatSummaries"]["playerStatSummarySet"] 
      if summary["playerStatSummaryType"] == "RankedSolo5x5"][0] 
-1

你仍然可以做到這一點,但你必須訪問數據結構正確。 json.load()返回的是JSON object,它與Python字典相同。直到你得到它具有與'playerStatSummarySet'鍵控數據成員,它實際上是一個Python列表,而不是另一個對象字典'playerStatSummaries'對象這OBJ有一個名爲它'data'與另一個對象的字典相關聯的密鑰等下去。

下面是如何通過的總結集,列表中搜索,找到特定的條目中的例子 - 記住,因爲這數據項是一個列表,而不是字典對象,你必須一步通過每個條目在它找到一個你正在尋找,而不是隻是查找它的名字。

import json 

with open('data.txt', 'r') as f: 
    jsonObj = json.load(f) 

targetSummaryType = 'RankedSolo5x5' 
for summarySet in jsonObj['data']['playerStatSummaries']['playerStatSummarySet']: 
    if summarySet['playerStatSummaryType'] == targetSummaryType: 
     print 'max rating for {}: {}'.format(targetSummaryType, 
              summarySet['maxRating']) 
     break # if you only expect there to be one 

輸出:

max rating for RankedSolo5x5: 1505 

爲了弄清楚需要什麼,我認爲有必要首先pprint()整個jsonObj這使得結構很容易看到。

相關問題