You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity中加载data.json文件及C#解析JSON数据的方法求助

嘿,我来帮你搞定这个问题!不管是在纯C#环境下解析JSON,还是在Unity里加载并处理data.json,都有成熟的方案,我给你一步步拆解清楚:

一、纯C#环境下解析JSON数据

目前主流的有两种方案,分别是微软官方的System.Text.Json和老牌的Newtonsoft.Json(Json.NET),根据你的.NET版本选择就行:

1. 使用System.Text.Json(.NET Core/.NET 5+ 自带)

这是微软主推的原生库,不需要额外安装包,性能也不错:

  • 第一步:先定义和你的JSON结构完全匹配的实体类(属性名尽量和JSON键一致,或者通过特性映射),举个例子:
    // 假设你的JSON结构是 {"id":1,"userName":"Alice","scores":[90,85]}
    public class PlayerData
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public List<int> Scores { get; set; }
    }
    
  • 第二步:读取文件并反序列化:
    using System.Text.Json;
    using System.IO;
    
    // 读取JSON文件内容
    string jsonContent = File.ReadAllText(@"C:\YourPath\data.json");
    
    // 反序列化为实体对象,支持忽略大小写匹配
    var options = new JsonSerializerOptions
    {
        PropertyNameCaseInsensitive = true // 比如JSON里的"id"可以匹配类里的"Id"
    };
    PlayerData data = JsonSerializer.Deserialize<PlayerData>(jsonContent, options);
    
    // 之后就可以直接使用数据啦
    Console.WriteLine($"玩家名称:{data.UserName}");
    

2. 使用Newtonsoft.Json(Json.NET)

这个库对复杂JSON结构的支持更灵活,适合处理动态字段或嵌套层级多的场景,需要先通过NuGet安装Newtonsoft.Json包:

  • 同样先定义实体类,然后解析:
    using Newtonsoft.Json;
    using System.IO;
    
    string jsonContent = File.ReadAllText(@"C:\YourPath\data.json");
    PlayerData data = JsonConvert.DeserializeObject<PlayerData>(jsonContent);
    
  • 如果你不想定义实体类,还可以用动态解析:
    dynamic dynamicData = JsonConvert.DeserializeObject(jsonContent);
    // 直接访问字段,比如 dynamicData.userName
    Console.WriteLine($"玩家名称:{dynamicData.userName}");
    
二、Unity引擎中加载并解析data.json文件

Unity里加载JSON需要注意文件的存放位置,不同位置对应不同的加载方式,常用的有两种:

1. 放在Resources文件夹加载

适合小型配置文件,文件会被打包进游戏,不能在运行时修改:

  • 先在Unity项目中创建Resources文件夹(如果没有的话),把data.json放进去(比如Resources/Configs/data.json);
  • 加载代码示例:
    using UnityEngine;
    using System.Text.Json; // 或者用Newtonsoft.Json,需要导入包
    
    public class JsonLoader : MonoBehaviour
    {
        void Start()
        {
            // 加载时不需要带.json后缀,路径是相对于Resources的
            TextAsset jsonText = Resources.Load<TextAsset>("Configs/data");
            if (jsonText == null)
            {
                Debug.LogError("找不到data.json文件,请检查路径是否正确!");
                return;
            }
    
            // 反序列化为实体类
            PlayerData data = JsonSerializer.Deserialize<PlayerData>(jsonText.text);
            Debug.Log($"加载成功:玩家ID {data.Id}");
        }
    }
    

2. 放在StreamingAssets文件夹加载

适合需要保留原始文件、支持运行时读取的场景(比如PC/移动端,WebGL需要特殊处理):

  • 创建StreamingAssets文件夹,把data.json放进去;
  • 加载代码示例(兼容多平台):
    using UnityEngine;
    using System.IO;
    using System.Text.Json;
    using System.Threading.Tasks;
    
    public class StreamingAssetsLoader : MonoBehaviour
    {
        async void Start()
        {
            string filePath = Path.Combine(Application.streamingAssetsPath, "data.json");
            string jsonContent = string.Empty;
    
            // WebGL平台不能直接读取文件,需要用UnityWebRequest
            if (Application.platform == RuntimePlatform.WebGLPlayer)
            {
                using (UnityWebRequest www = UnityWebRequest.Get(filePath))
                {
                    await www.SendWebRequest();
                    if (www.result != UnityWebRequest.Result.Success)
                    {
                        Debug.LogError($"加载失败:{www.error}");
                        return;
                    }
                    jsonContent = www.downloadHandler.text;
                }
            }
            else
            {
                // 其他平台直接读取文件
                jsonContent = File.ReadAllText(filePath);
            }
    
            PlayerData data = JsonSerializer.Deserialize<PlayerData>(jsonContent);
            Debug.Log($"加载成功:玩家分数 {data.Scores[0]}");
        }
    }
    

额外:Unity自带的JsonUtility

如果你的JSON结构比较简单,也可以用Unity原生的JsonUtility,但它要求类必须标记[Serializable],且只支持字段(不支持自动属性):

[Serializable]
public class PlayerData
{
    public int Id;
    public string UserName;
    public List<int> Scores;
}

// 解析代码
PlayerData data = JsonUtility.FromJson<PlayerData>(jsonText.text);

如果你的JSON结构比较特殊(比如有动态字段、嵌套数组等),可以告诉我具体的JSON格式,我再帮你调整解析方案~

内容的提问来源于stack exchange,提问作者Davil

火山引擎 最新活动