You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python调用JSON中的userid值?附JSON结构优化建议

问题

现有如下结构的JSON文件:

{
    "item": {
        "userid":"",
        "subitem": {
            "object0":"",
            "object0times":"",
            "object1":"",
            "object1times":"",
            "object2":"",
            "object2times":""
        }
    },
    "item1": {
        "userid":"",
        "subitem": {
            "object0":"",
            "object0times":"",
            "object1":"",
            "object1times":"",
            "object2":"",
            "object2times":""
        }
    }
}

尝试用以下Python代码读取userid值时触发KeyError:

with open('dictionary.json') as f:
        d = json.load(f)
        print(d[userid])

错误信息:

discord.ext.commands.errors.CommandInvokeError: Command raised an exception: KeyError: 'userid'

已知userid是item/item1的子层级键,需要解决正确读取目标值的方法,以及优化JSON结构提升检索速度的方案。


解决方法

1. 正确读取层级值

错误根源是直接访问顶层的userid键,但它实际存在于item和item1的子结构中,且代码中userid未加引号(作为字符串键需用引号包裹)。

  • 读取单个userid:

    import json
    
    with open('dictionary.json') as f:
        d = json.load(f)
        # 读取item下的userid
        print(d['item']['userid'])
        # 读取item1下的userid
        print(d['item1']['userid'])
        # 读取subitem下的具体object值,比如object0
        print(d['item']['subitem']['object0'])
    
  • 遍历所有顶层对象的userid:
    如果后续有更多类似item/item1的键,可循环遍历顶层键批量获取:

    import json
    
    with open('dictionary.json') as f:
        d = json.load(f)
        for top_key in d:
            print(d[top_key]['userid'])
            print(d[top_key]['subitem']['object1times'])
    

2. 优化JSON结构提升检索效率

当前用item/item1作为顶层键的结构,不利于按userid快速检索,可根据使用场景调整:

方案一:用数组存储用户对象

适合批量处理或用户数量动态变化的场景,检索时可快速定位目标用户:

{
    "users": [
        {
            "userid": "user_001",
            "subitem": {
                "object0": "",
                "object0times": "",
                "object1": "",
                "object1times": "",
                "object2": "",
                "object2times": ""
            }
        },
        {
            "userid": "user_002",
            "subitem": {
                "object0": "",
                "object0times": "",
                "object1": "",
                "object1times": "",
                "object2": "",
                "object2times": ""
            }
        }
    ]
}

读取指定userid的示例:

import json

target_userid = "user_001"
with open('dictionary.json') as f:
    d = json.load(f)
    # 快速匹配目标用户
    target_user = next(user for user in d['users'] if user['userid'] == target_userid)
    print(target_user['subitem']['object0times'])

方案二:用userid作为顶层键

适合频繁通过userid直接访问数据的场景,检索时间复杂度为O(1):

{
    "user_001": {
        "subitem": {
            "object0": "",
            "object0times": "",
            "object1": "",
            "object1times": "",
            "object2": "",
            "object2times": ""
        }
    },
    "user_002": {
        "subitem": {
            "object0": "",
            "object0times": "",
            "object1": "",
            "object1times": "",
            "object2": "",
            "object2times": ""
        }
    }
}

读取指定userid的示例:

import json

target_userid = "user_001"
with open('dictionary.json') as f:
    d = json.load(f)
    # 直接通过userid访问对应数据
    print(d[target_userid]['subitem']['object2'])

内容的提问来源于stack exchange,提问作者gallmonds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:37:41