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

如何从JSON文件提取操作哈希/对象 解决Unity JsonUtility读值为空问题

问题原因

你读不到content字段的核心原因是类型定义不匹配:

  • 你的JSON结构里content是嵌套对象,包含body剧情文本和options选项数组
  • 但你在Page类里把content定义成了string类型,Unity自带的JsonUtility是强类型序列化工具,遇到类型不匹配的字段会直接赋值为空,不会自动把对象转成字符串返回。
解决方案

直接按照JSON的嵌套结构定义对应可序列化类,用强类型接收嵌套数据,这是Unity里用JsonUtility最稳定、性能最好的方式,步骤如下:

  1. 新增选项类,对应content下的单个选项结构
// Option.cs
[System.Serializable]
public class Option
{
    public string option_text;
    public string destination;
}
  1. 新增Content类,对应content字段的整体结构
// Content.cs
[System.Serializable]
public class Content
{
    public string body;
    public Option[] options;
}
  1. 修改原有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:42:18