检查来自两个不同JSON文件的JSON对象中的值是否相似,并使用python创建匹配结果列表

检查来自两个不同JSON文件的JSON对象中的值是否相似,并使用python创建匹配结果列表,python,json,api,python-3.x,Python,Json,Api,Python 3.x,我试图最小化从API发送到应用程序的数据,但有些值为null,但可以在另一个API中找到,因此我考虑在服务器上运行python脚本,将这些null结果添加到原始JSON文件中 我将添加一个列表,该列表中存储有与原始JSON文件中的列表相匹配的信息,这可以通过使用与这两个文件中的视频游戏标题相对应的唯一ID来完成。这是我的密码: import json games = open('outputgames.json') releases = open('outputreleases.json')

我试图最小化从API发送到应用程序的数据,但有些值为null,但可以在另一个API中找到,因此我考虑在服务器上运行python脚本,将这些null结果添加到原始JSON文件中

我将添加一个列表,该列表中存储有与原始JSON文件中的列表相匹配的信息,这可以通过使用与这两个文件中的视频游戏标题相对应的唯一ID来完成。这是我的密码:

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)
games_data['results']中的初始列表包含大约480个结果,而releases_data['results']中的列表包含470个结果。但出于某种原因,我的代码似乎跳过了一些结果,我应该会收到大约480个结果,但我只得到大约260个结果。我猜我对“IF”语句所做的迭代跳过了它已经传递的一些id,但我不确定。如果有人能帮我做If语句,不是从它离开的地方继续,而是从顶部继续,并实际检查所有ID是否匹配

如果有人能帮我解决这个问题,或者我做错了什么。任何帮助都很好,提前谢谢

下面是分组的_数据将返回的示例,这只是一个条目。当使用json文件运行时,它会返回大约260个,但正如我前面所说的,我应该会返回数百个:

[{"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"}}]<
奥运会数据:

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

编辑:这是不正确的。我把它作为评论的背景

您发布的发布数据示例的问题出现在第一个字段:
“deck”:null
如果我试图从这个字符串创建JSON对象,我会得到

builtins.NameError: name 'null' is not defined
必须有某个try-catch块忽略此异常。你可以定义一下

null = None
在处理文件之前,如果这是唯一的问题。也许您应该测试可以从这两个文件中的每一个创建多少个JSON对象,以找到任何其他问题,然后再继续合并它们


作为一个调试技巧,一旦我从您那里得到了要处理的数据,我大概花了五分钟来分析。我所做的就是调用
json。在两个字符串上加载
,并读取错误消息。从最底层开始,然后向上爬,总是(嗯,几乎总是)值得的。:-)

这张单子我看对了。你能举一个例子,说明一对你期望在
分组的\u数据中,但不是吗?是的,我已经把它添加到问题中了。让我觉得IF语句可能有问题的是,我还尝试将不同的数据与不同列表中的名称(而不是ID)关联,但它返回了相同的精确结果。谢谢,但我们还没有达到相同的波长。我想看到的是
games\u data
中的一个JSON对象,而
中的一个JSON对象发布了您认为应该在
grouped\u data
中配对的\u data
,但它们不是如此配对。你说你期望得到480个结果,但你只得到260个左右。请给我们一个丢失的220的例子。我很抱歉,我发布了一个没有返回的结果的例子,因为文件中有分配的数据,所以我很难找到这些结果。这里使用的IF语句是否可能忽略它传递的ID以匹配它要查找的ID?我试图找到一些与这个问题相关的信息,但我在网上找不到明确的答案。实际上,当我尝试用JSON.loads加载JSON时,它会自动将“null”转换为“None”,因此这意味着所有文件基本上都已转换。也尝试了json.load,结果相同,空值已替换为“无”。我认为这是我的迭代中的一个问题,因为即使我尝试比较“Name”对象,它也会返回相同的结果。另外,非常感谢你和我一起跟进这个问题。>>>json.loads('{deck:null}')结果:{deck:None}你是对的;我的脸是红的。我不明白我是怎么得到这个名字的。当我完全按照我记得的那样做的时候,效果就很好了。不幸的是,我只是在REPL中输入了它,所以我没有脚本可以查看。我会一直考虑的。我仍然不明白迭代怎么会有问题。如果制作两个测试文件,每个文件都包含示例中的两条记录,会发生什么情况?我自己尝试了前面评论中建议的实验,效果很好。正如预期的那样,final_results.json包含一个元素列表。我很困惑。我要做的是编写一个小脚本,将两个文件中的ID提取到两个新文件中,并在这些新文件上测试比较迭代。正如你之前所说,有那么多额外的数据,很难看到发生了什么。隔离ID,测试它们,我仍然得到相同的精确结果。我只是假设API目前非常无序,并且他们可能为同一个游戏分配不同的ID(tho,他们不应该这样做)。我将不得不使用不匹配的ID并自己构建自己的对象。最后一个问题tho,你能给我解释一下我代码中的IF语句在检查匹配ID时运行的过程吗?一旦找到匹配的ID,它会重新迭代所有ID,还是从它停止的地方继续?再次感谢您的帮助。这就像两个嵌套的
for
循环。它生成游戏和发行版的所有可能组合,并检查它们是否具有相同的id。不过,列表理解通常比循环快。它不知道最多会有一个匹配的ID,所以一旦找到匹配的ID,它就会继续运行。它根据每个版本检查第一个游戏;然后是第二场比赛,每一场比赛都会发布,以此类推。
null = None