2013-01-07 4 views
4

J'essaie d'obtenir une valeur spécifique en Python d'un objet JSON. Avant que je puisse utiliser quelque chose comme:JSON dans Python: Comment obtenir des parties spécifiques d'un tableau?

data [ « data »] [ « données2 »]

pour obtenir une certaine valeur qui est associée à données2, mais c'est un peu différent, mon fichier JSON est maintenant plus complexe et est-ce

{ 
    "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 
} 

Comme vous pouvez le voir ce qui est vraiment long, ma question est, comment pourrais-je saisir que des valeurs spécifiques d'un certain playerStatSummarySet ensemble? Comme disons que je voulais seulement saisir la valeur d'évaluation de l'ensemble avec la valeur playerStatSummaryType de RankedSolo5x5 comment ferais-je cela?

Voici ce que j'ai déjà fait pour obtenir les données du fichier JSON.

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

C'est juste une 'liste'. Utilisez-le comme un autre. – Izkata

Répondre

4

si vous devez travailler avec des objets JSON complexes, je vous suggère de jeter un oeil à jsonpath qui offre xpath comme langue pour json objets.

Un exemple:

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

sur:

[1505] 
+0

Merci, alors qu'il y avait beaucoup de solutions à ma réponse ici, vous l'avez rendu vraiment pratique et facile à comprendre. –

1

Utilisez une compréhension liste

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

Vous pouvez toujours le faire, mais vous devez accéder à la structure de données correctement. Ce qui renvoie json.load() est un JSON object qui est identique à un dictionnaire Python. Cette obj a une clé nommée 'data' qui est associée à un autre dictionnaire d'objets, etc. jusqu'à ce que vous arriviez à l'objet 'playerStatSummaries' qui a un membre de données avec 'playerStatSummarySet' qui est en fait une liste Python plutôt qu'un autre dictionnaire d'objets. Voici un exemple de recherche dans cette liste d'ensembles de récapitulatifs et de recherche d'une entrée spécifique. Rappelez-vous que, comme cet élément de données est une liste plutôt qu'un objet dictionnaire, vous avez parcouru chacune des entrées pour trouver le celui que vous cherchez plutôt que de simplement chercher son nom.

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 

Sortie:

max rating for RankedSolo5x5: 1505 

Pour comprendre ce qui était nécessaire je l'ai trouvé utile d'abord pprint() l'ensemble jsonObj qui a fait la structure très facile à voir.

Questions connexes