在Python中有效解析JSON输出?

Pur*_*rdy 3 python python-3.x python-requests steam-web-api steam

下面的代码块可以工作,但是由于我对使用JSON的了解有限,我不满意它的最佳选择,但是我似乎无法找出一种更有效的方法。

steam_game_db是这样的:

{
    "applist": {
        "apps": [
            {
                "appid": 5,
                "name": "Dedicated Server"
            },
            {
                "appid": 7,
                "name": "Steam Client"
            },
            {
                "appid": 8,
                "name": "winui2"
            },
            {
                "appid": 10,
                "name": "Counter-Strike"
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的Python代码是

i = 0
x = 570

req_name_from_id = requests.get(steam_game_db)
j = req_name_from_id.json()

while j["applist"]["apps"][i]["appid"] != x:
    i+=1
returned_game = j["applist"]["apps"][i]["name"]
print(returned_game)
Run Code Online (Sandbox Code Playgroud)

除了遍历整个应用程序列表之外,还有一种更聪明的方法来搜索它吗?理想情况下,数据结构中带有“ appid”和“ name”的元素编号为其对应的“ appid”

即列表中的appid 570是Dota2,但是appid 5069和Red Faction中数据结构中的元素570

另外,这是什么类型的数据结构?也许它已经限制了我对此答案的搜索能力。(对于我来说,每个元素似乎都是“ appid”和“ element”的字典?)

编辑:根据建议更改为for循环

# returned_id string for appid from another query

req_name_from_id = requests.get(steam_game_db)
j_2 = req_name_from_id.json()

for app in j_2["applist"]["apps"]:
    if app["appid"] == int(returned_id):
        returned_game = app["name"]

print(returned_game)
Run Code Online (Sandbox Code Playgroud)

Tom*_*lak 5

通过键(如此处的应用程序ID)访问内容的最便捷方法是使用字典。

您需要预先支付一些额外的性能费用来填充字典,但是在此之后,通过ID提取值基本上是免费的。

但是,这是一个权衡。如果您只想在Python程序的生命周期内进行一次查找,那么与像您已经做过的简单循环相比,为构建字典而付出的额外性能成本将无济于事。但是,如果您想进行多次查找,那将是有益的。

# build dictionary
app_by_id = {}
for app in j["applist"]["apps"]:
  app_by_id[app["appid"]] = app["name"]

# use it
print(app_by_id["570"])
Run Code Online (Sandbox Code Playgroud)

还可以考虑将JSON文件缓存在磁盘上。这样可以节省程序启动期间的时间。