Python学习:解析Stardew Valley作物JSON文件特定值报错求助
问题根因
- JSON结构设计存在不一致问题:
你提供的JSON片段中,purchase_price字段的结构没有统一规范:- 蓝爵士(Blue Jazz)的
purchase_price是长度为1的列表,唯一的字典元素包含了所有商店的价格键 - 远古水果(Ancient Fruit)的
purchase_price是长度为3的列表,每个字典元素仅存储单个商店的价格键
你固定用cropnames["purchase_price"][0]["Traveling Cart"]取值时,第二个作物的第一个字典仅包含Pierres's键,不存在Traveling Cart键,直接触发KeyError。
- 蓝爵士(Blue Jazz)的
- 取值逻辑存在两处错误:
- 最初的判断逻辑存在类型错误:JSON中的null值解析到Python后是
None对象,不是字符串"null",你最开始写的if not "null" in ...逻辑完全不生效 - 现有取值逻辑仅能校验Traveling Cart的价格,无法遍历所有商店过滤非null的有效价格,不符合你的需求。
- 最初的判断逻辑存在类型错误:JSON中的null值解析到Python后是
优化方案
方案1:调整JSON结构(推荐)
把purchase_price字段改为直接存储单个字典,无需嵌套列表,结构更清晰也更容易解析:
"purchase_price": { "Pierres's": 30, "JojaMart": 37, "Traveling Cart": null }
调整后解析代码可以简化为:
def getcrops(season): print("CROPS") print("----------------------") for crop in crops[season]: valid_prices = {k:v for k,v in crop["purchase_price"].items() if v is not None} if valid_prices: print(f"CROP: {crop['name']:20} PRICE: {valid_prices}") getcrops("spring")
方案2:不修改JSON,适配现有结构解析
如果无法调整JSON格式,可以先把分散在列表里的价格字典汇总后再过滤:
def getcrops(season): print("CROPS") print("----------------------") for crop in crops[season]: # 汇总所有商店价格 all_prices = {} for item in crop["purchase_price"]: all_prices.update(item) # 过滤非null的有效价格 valid_prices = {k:v for k,v in all_prices.items() if v is not None} if valid_prices: print("CROP: {0:20} PRICE: {1}".format(crop["name"], valid_prices)) getcrops("spring")
内容的提问来源于stack exchange,提问作者Zachary Turner
相关产品推荐
相关产品推荐

