如何从JSON文件提取操作哈希/对象 解决Unity JsonUtility读值为空问题
问题原因
你读不到content字段的核心原因是类型定义不匹配:
- 你的JSON结构里
content是嵌套对象,包含body剧情文本和options选项数组 - 但你在
Page类里把content定义成了string类型,Unity自带的JsonUtility是强类型序列化工具,遇到类型不匹配的字段会直接赋值为空,不会自动把对象转成字符串返回。
解决方案
直接按照JSON的嵌套结构定义对应可序列化类,用强类型接收嵌套数据,这是Unity里用JsonUtility最稳定、性能最好的方式,步骤如下:
- 新增选项类,对应
content下的单个选项结构
// Option.cs [System.Serializable] public class Option { public string option_text; public string destination; }
- 新增Content类,对应
content字段的整体结构
// Content.cs [System.Serializable] public class Content { public string body; public Option[] options; }
- 修改原有
Page类,把content的类型从string改成刚定义的Content类型
// Page.cs 修改后 [System.Serializable] public class Page { public string page_number; public Content content; // 修正类型,不要再用string声明 }
原有Pages类不需要做任何改动,保持原有定义即可。
读取嵌套数据的方式
修改完类结构后,就可以在代码里直接访问嵌套字段了,示例:
// JSONReader.cs 修改后读取逻辑 void Start() { Pages pagesInJson = JsonUtility.FromJson<Pages>(jsonFile.text); foreach (Page page in pagesInJson.pages) { Debug.Log($"当前页码:{page.page_number}"); Debug.Log($"剧情文本:{page.content.body}"); // 遍历所有分支选项 foreach (Option opt in page.content.options) { Debug.Log($"选项:{opt.option_text},跳转目标页码:{opt.destination}"); } } }
运行后就能正常拿到所有content下的嵌套数据,不会再出现空值。
补充说明
如果你确实需要把content存为原始JSON字符串、不想定义强类型类,Unity自带的JsonUtility不支持这个需求,你需要换用Newtonsoft.Json(Json.NET)做解析,用JToken类型接收content字段再转成字符串即可。但对于自选剧情游戏这类数据结构固定的场景,更推荐前面的强类型方案,开发时不容易写错字段名,运行性能也更高。
内容的提问来源于stack exchange,提问作者JesseWelch92
相关产品推荐
相关产品推荐

