Unity读取按国家分类的姓名JSON时出现空引用错误排查
Unity读取姓名JSON空引用问题解决
问题原因
Unity内置的JsonUtility对序列化/反序列化的类型有严格限制,不支持直接处理Dictionary类型,也无法解析顶层为键值对集合的JSON结构。你的代码中FirstNames类的countries字段是Dictionary<string, FirstName>,JsonUtility无法正确赋值,导致该字段为null,触发空引用异常。
解决方案
方案一:用可序列化列表替代Dictionary(适配原生JsonUtility)
如果不想引入第三方库,可以修改C#类结构和JSON格式,用可序列化的键值对列表模拟字典:
修改后的C#代码
using System.Collections; using System.Collections.Generic; using UnityEngine; // 标记为可序列化,让JsonUtility识别 [System.Serializable] public class FirstName { public List<string> male; public List<string> female; } [System.Serializable] public class CountryNameEntry { public string country; // 国家名称 public FirstName names; // 对应性别姓名列表 } [System.Serializable] public class FirstNames { public List<CountryNameEntry> countryList; } public class JSONReader : MonoBehaviour { public TextAsset jsonFile; void Start(){ FirstNames firstNamesInJson = JsonUtility.FromJson<FirstNames>(jsonFile.text); // 查找指定国家的姓名数据 var targetCountry = firstNamesInJson.countryList.Find(entry => entry.country == "India"); if(targetCountry != null){ Debug.Log("Found name: " + targetCountry.names.male[0]); } } }
对应修改后的JSON
{ "countryList": [ { "country": "India", "names": { "male": ["A_Jay", "Aaban", "Aabid", "Aabir", "Aadam"], "female": ["A_Jay", "Aaban", "Aabid", "Aabir", "Aadam"] } }, { "country": "Usa", "names": { "male": ["A_Jay", "Aaban", "Aabid", "Aabir", "Aadam"], "female": ["A_Jay", "Aaban", "Aabid", "Aabir", "Aadam"] } } ] }
方案二:使用Newtonsoft.Json(推荐,无需修改原JSON)
Unity官方提供了Newtonsoft.Json的NuGet包,支持Dictionary等复杂类型的反序列化,无需改动原有JSON结构:
安装Newtonsoft.Json包:
- 打开Unity Package Manager → 点击左上角"+" → 选择"Add package by name..."
- 输入
com.unity.nuget.newtonsoft-json,点击添加完成安装。
修改后的C#代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using Newtonsoft.Json; public class FirstName { public List<string> male; public List<string> female; } public class FirstNames { public Dictionary<string, FirstName> countries; } public class JSONReader : MonoBehaviour { public TextAsset jsonFile; void Start(){ // 直接解析原有JSON,无需修改 FirstNames firstNamesInJson = JsonConvert.DeserializeObject<FirstNames>(jsonFile.text); Debug.Log("Found name: " + firstNamesInJson.countries["India"].male[0]); } }
甚至可以简化代码,直接解析为Dictionary,不需要FirstNames类:
void Start(){ var nameDictionary = JsonConvert.DeserializeObject<Dictionary<string, FirstName>>(jsonFile.text); Debug.Log("Found name: " + nameDictionary["India"].male[0]); }
内容的提问来源于stack exchange,提问作者camelMilk_
相关产品推荐
相关产品推荐

