Unity使用JsonUtility读取JSON无报错但获取数据为空问题求助
问题原因
- JSON根结构与反序列化目标类不匹配:你的JSON根节点是一个包含
Dialogue字段的对象,并非直接的Dialogue类结构,直接反序列化到Dialogue类无法匹配到对应字段,所以得到空对象。 - 字段类型不匹配:Dialogue类中定义的
sentences是string[]类型,但JSON里的sentences是包含text1/text2/text3三个属性的对象数组,类型不匹配会直接导致解析失败。
解决方法
第一步:调整类定义匹配JSON结构
新增根节点包裹类,同时新增Sentence类对应sentences数组内的对象结构:
[System.Serializable] public class JsonRoot { // 字段名需和JSON根节点下的Dialogue字段完全一致 public Dialogue Dialogue; } [System.Serializable] public class Sentence { // 字段名和JSON里sentence对象的属性完全对应 public string text1; public string text2; public string text3; } [System.Serializable] public class Dialogue { public string npcName; // 将原有的string[]替换为Sentence数组,匹配JSON结构 public Sentence[] sentences; }
第二步:修改反序列化逻辑
将反序列化目标改为根节点类,再从中提取Dialogue对象即可:
public TextAsset jsonScript; public Dialogue dialogue; void Start() { try { // 先反序列化到根包裹类 JsonRoot root = JsonUtility.FromJson<JsonRoot>(jsonScript.text); dialogue = root.Dialogue; } catch (System.Exception error) { Debug.LogError(error); } }
注意事项
- Unity的
JsonUtility对字段名大小写敏感,类内字段名必须和JSON里的属性名完全一致,包括大小写,否则会解析失败。 - 所有参与序列化/反序列化的自定义类必须加
[System.Serializable]特性,否则JsonUtility无法识别。
内容的提问来源于stack exchange,提问作者can çağlar kırıcı
相关产品推荐
相关产品推荐

