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

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结构:

  1. 安装Newtonsoft.Json包:

    • 打开Unity Package Manager → 点击左上角"+" → 选择"Add package by name..."
    • 输入com.unity.nuget.newtonsoft-json,点击添加完成安装。
  2. 修改后的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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:50:22