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

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。
  • 取值逻辑存在两处错误:
    1. 最初的判断逻辑存在类型错误:JSON中的null值解析到Python后是None对象,不是字符串"null",你最开始写的if not "null" in ...逻辑完全不生效
    2. 现有取值逻辑仅能校验Traveling Cart的价格,无法遍历所有商店过滤非null的有效价格,不符合你的需求。
优化方案

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:54:05