2015-10-13 3 views
0

J'essaye de minimiser les données que j'aurais envoyées à une application depuis une API mais certaines valeurs sont nulles mais peut être trouvé dans une autre API, j'ai donc pensé à faire tourner un script python sur un serveur pour ajouter ces résultats NULL au fichier JSON d'origine. J'ajoute la liste qui a cette information stockée à la liste qui le correspond dans le fichier JSON d'origine, ceci peut être fait en utilisant un identifiant unique qui correspond à un titre de jeu vidéo dans ces deux fichiers. Voici mon code:Vérifie si une valeur dans un objet JSON de 2 fichiers JSON différents est similaire et crée une liste de résultats correspondants avec python

import json 


games = open('outputgames.json') 
releases = open('outputreleases.json') 

games_json = json.load(games) 
releases_json = json.load(releases) 

# This is where all the results are found in the JSON file 
# The results are all stored in a list, so to access the first result 
# we would access it like this: games_json['results'][0] or games_data[0] 

games_data = games_json['results'] 
releases_data = releases_json['results] 

#This is where, i iterate through the data to see IF the id in the object 'game' which is found in releases_data 
#is similar to the one in games_data and then storing both matching results in a Dictionary and a list 
#then i just dump the results to a json file. 

grouped_data = [dict(data_releases = x, data_games= i) for x in releases_data for i in games_data if i['id'] == x['game']['id']] 

with open('final_results.json', mode = 'w') as f: 
    json.dump(grouped_data, f) 

La liste initiale games_data [ « résultats »] détient environ 480 résultats alors que celui releases_data [ « résultats »] détient 470. Mais pour une raison quelconque, mon code semble sauter par certains résultats, je suis censé recevoir environ 480 résultats, mais je reçois seulement environ 260 résultats. Je devine l'itération que je fais avec la déclaration "IF" ici saute quelques identifiants qu'il a déjà passés, mais je ne suis pas sûr. Si quelqu'un peut m'aider à faire la déclaration IF ne pas reprendre d'où il est parti mais à partir du haut et en fait vérifier si tous les identifiants correspondent.

Si quelqu'un peut m'aider s'il vous plaît avec ce problème que j'ai, ou si je fais quelque chose de mal. Toute aide est belle, merci d'avance.

Voici un exemple de ce que Grouped_data retournerait, ceci est seulement 1 entrée. il retourne environ 260 lorsqu'il est exécuté avec les fichiers JSON, mais comme je l'ai dit je suis déjà censé obtenir des centaines d'autres sont revenus:

[{"data_games": {"deck": "Tri Force Heroes is a co-op game set in The Legend of Zelda franchise. Three Links must work together to rid the land of Hyrule of evil once more.", "image": {"tiny_url": "http://static.giantbomb.com/uploads/square_mini/8/82063/2778000-tloztfh.jpg", "medium_url": "http://static.giantbomb.com/uploads/scale_medium/8/82063/2778000-tloztfh.jpg", "thumb_url": "http://static.giantbomb.com/uploads/scale_avatar/8/82063/2778000-tloztfh.jpg", "small_url": "http://static.giantbomb.com/uploads/scale_small/8/82063/2778000-tloztfh.jpg", "screen_url": "http://static.giantbomb.com/uploads/screen_medium/8/82063/2778000-tloztfh.jpg", "icon_url": "http://static.giantbomb.com/uploads/square_avatar/8/82063/2778000-tloztfh.jpg", "super_url": "http://static.giantbomb.com/uploads/scale_large/8/82063/2778000-tloztfh.jpg"}, "id": 49994}, "data_releases": {"deck": null, "image": null, "platform": {"api_detail_url": "http://www.giantbomb.com/api/platform/3045-138/", "id": 138, "name": "Nintendo 3DS eShop"}, "expected_release_day": 23, "expected_release_month": 10, "game": {"api_detail_url": "http://www.giantbomb.com/api/game/3030-49994/", "id": 49994, "name": "The Legend of Zelda: Tri Force Heroes"}, "expected_release_year": 2015, "id": 142927, "region": {"api_detail_url": "http://www.giantbomb.com/api/region/3075-1/", "id": 1, "name": "United States"}, "expected_release_quarter": null, "name": "The Legend of Zelda: Tri Force Heroes"}}]< 

Voici un exemple de « releases_data » et « games_data » qui n'a pas été retourné dans la résultat mais fait en fait les ID de match:

releases_data:

{"deck":null,"game":{"api_detail_url":"http:\/\/www.giantbomb.com\/api\/game\/3030-50627\/","id":50627,"name":"Orion Trail"},"id":144188,"image":null,"name":"Orion Trail","platform":{"api_detail_url":"http:\/\/www.giantbomb.com\/api\/platform\/3045-94\/","id":94,"name":"PC"}} 

games_data:

{"deck":"Orion Trail is a single player choose-your-own-space-adventure.","id":50627,"image":{"icon_url":"http:\/\/static.giantbomb.com\/uploads\/square_avatar\/29\/291401\/2775039-6490638002-heade.jpg","medium_url":"http:\/\/static.giantbomb.com\/uploads\/scale_medium\/29\/291401\/2775039-6490638002-heade.jpg","screen_url":"http:\/\/static.giantbomb.com\/uploads\/screen_medium\/29\/291401\/2775039-6490638002-heade.jpg","small_url":"http:\/\/static.giantbomb.com\/uploads\/scale_small\/29\/291401\/2775039-6490638002-heade.jpg","super_url":"http:\/\/static.giantbomb.com\/uploads\/scale_large\/29\/291401\/2775039-6490638002-heade.jpg","thumb_url":"http:\/\/static.giantbomb.com\/uploads\/scale_avatar\/29\/291401\/2775039-6490638002-heade.jpg","tiny_url":"http:\/\/static.giantbomb.com\/uploads\/square_mini\/29\/291401\/2775039-6490638002-heade.jpg"}} 
+0

La compréhension de la liste me semble juste. Pouvez-vous donner un exemple d'une paire que vous attendez dans 'grouped_data', mais ce n'est pas le cas? – saulspatz

+0

Oui, je l'ai ajouté à la question.Ce qui m'a fait penser que cela pourrait être un problème avec la déclaration IF, c'est que j'ai aussi essayé d'associer les différentes données avec des noms au lieu de l'ID dans les différentes listes, mais cela m'a donné les mêmes résultats. –

+0

Merci, mais nous ne sommes pas encore sur la même longueur d'onde. Ce que j'aimerais voir, c'est un objet JSON de 'games_data', et un objet JSON de' releases_data' qui, selon vous, devrait être apparié dans 'grouped_data' mais qui ne le sont pas. Vous dites que vous attendez environ 480 résultats, mais vous obtenez seulement 260 ou plus. S'il vous plaît donnez-nous un exemple de l'un des 220 manquant. – saulspatz

Répondre

0

EDIT: CECI EST INCORRECT. Je le laisse juste comme contexte pour les commentaires.

Le problème avec l'exemple que vous avez publié pour releases_data est dans le premier champ: "deck":null Si je tente de créer un objet JSON de cette chaîne, je reçois

builtins.NameError: name 'null' is not defined 

Il doit y avoir un bloc try-catch quelque part qui ignore cette exception. Vous pouvez simplement définir

null = None 

avant de traiter les fichiers, si c'est le seul problème. Peut-être devriez-vous tester le nombre d'objets JSON que vous pouvez créer à partir de chacun des deux fichiers, afin de localiser les problèmes supplémentaires avant de les fusionner. Juste comme un conseil de débogage, cela m'a pris peut-être cinq minutes pour analyser, une fois que j'ai obtenu les données pour travailler avec vous. Tout ce que j'ai fait, c'était appeler le json.loads sur les deux chaînes et lire le message d'erreur. C'est toujours (presque toujours) de commencer par le bas et de travailler. :-)

+0

En fait, lorsque j'essaie de charger le fichier JSON avec json.loads, il convertit automatiquement 'null' en None, ce qui signifie que tous les fichiers sont fondamentalement déjà convertis. Essayé avec json.load aussi et c'est les mêmes résultats, les nulls sont déjà remplacés par "None". Je pensais que c'était un problème avec mon itération parce que même quand j'essaie de comparer l'objet "Nom", il renvoie les mêmes résultats. Aussi, merci beaucoup d'avoir suivi ce sujet avec moi. >>> json.loads ('{"deck": null}') Résultat: {'deck': Aucun} –

+0

Vous avez raison; mon visage est rouge. Je ne comprends pas ce que j'ai fait pour obtenir le NameError. Quand je fais exactement ce dont je me souviens avant, ça marche très bien. Malheureusement, je l'ai juste tapé dans le REPL, donc je n'ai pas de script à regarder. Je continuerai à y penser. Je ne vois toujours pas comment cela peut être un problème avec l'itération. Que se passe-t-il si vous créez deux fichiers de test, un avec chacun des deux enregistrements de votre exemple? – saulspatz

+0

J'ai essayé l'expérience que j'ai suggéré dans le commentaire précédent moi-même, et cela a bien fonctionné. final_results.json contient une liste d'un élément, comme prévu. Je suis déconcerté. Ce que je ferais est d'écrire un petit script pour extraire les identifiants des deux fichiers dans deux nouveaux fichiers, et tester l'itération de comparaison sur ces nouveaux fichiers. Comme vous l'avez dit plus tôt, avec toutes ces données supplémentaires, il est difficile de voir ce qui se passe. – saulspatz