如何用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
相关产品推荐
相关产品推荐

