Unity中JSON实现物品数据库遭遇KeyNotFoundException求助
解决Unity中LitJson读取JSON时的KeyNotFoundException问题
这是个典型的JSON字段层级匹配错误导致的异常,咱们来一步步搞定它:
问题根源
看你ConstructItemDatabase方法里的这段代码:
(int)itemData[i]["stats"]["value"]
你试图从stats对象里读取value字段,但回头看你的Items.json结构,value是和id、title平级的顶级字段,根本不在stats内部!LitJson找不到这个不存在的键,自然就抛出KeyNotFoundException了。
修复方案
修改ConstructItemDatabase方法中传递给Item构造函数的value参数,直接从根节点读取,而不是从stats里取:
修改前的错误代码片段
database.Add(new Item( (int)itemData[i]["id"], itemData[i]["title"].ToString(), (int)itemData[i]["stats"]["value"], // 这里的层级错误 (int)itemData[i]["stats"]["power"], (int)itemData[i]["stats"]["defence"], (int)itemData[i]["stats"]["vitality"], itemData[i]["description"].ToString(), (bool)itemData[i]["stackable"], (int)itemData[i]["rarity"], itemData[i]["slug"].ToString() ));
修改后的正确代码
database.Add(new Item( (int)itemData[i]["id"], itemData[i]["title"].ToString(), (int)itemData[i]["value"], // 直接从根节点读取value (int)itemData[i]["stats"]["power"], (int)itemData[i]["stats"]["defence"], (int)itemData[i]["stats"]["vitality"], itemData[i]["description"].ToString(), (bool)itemData[i]["stackable"], (int)itemData[i]["rarity"], itemData[i]["slug"].ToString() ));
额外调试小技巧
以后遇到类似的JSON解析问题,可以用这些方法快速定位:
- 在循环里添加
Debug.Log(itemData[i].ToJson());,打印当前解析的JSON节点内容,直观确认字段的实际层级 - 给LitJson的读取代码加个安全判断,比如用
itemData[i].ContainsKey("value")先检查键是否存在,避免直接访问抛出异常 - 用Visual Studio的断点,查看
itemData[i]的内部结构,清晰确认每个字段的位置
内容的提问来源于stack exchange,提问作者Kyle Russell
相关产品推荐
相关产品推荐

