如何正确使用Unity的JsonUtility.FromJson()反序列化字符串
解决Unity C#中JSON反序列化生成玩家数据对象的问题
嘿,我看你在Unity里搞自定义类的JSON序列化/反序列化、配合MySQL存玩家数据的时候,卡在测试环节没法生成Dummy玩家对象了——刚好我之前做类似功能踩过不少坑,给你梳理几个关键步骤和排查点:
1. 先把自定义玩家类的序列化基础搞定
不管用Unity自带的工具还是第三方库,你的PlayerData类得先满足序列化规则,不然肯定转不出来:
- 如果用Unity原生的
JsonUtility,必须给类加上[Serializable]标记;如果用Newtonsoft.Json的话可以不用,但加上也不影响兼容性 - 类里的字段要么设成public,要么给私有字段加
[SerializeField](这个是Unity专属的,Newtonsoft不吃这套) - 玩家数据里别放Unity特有的不可序列化类型,比如
GameObject、Transform这类,就存字符串、数字、布尔这种基础类型,或者自己写的小序列化类就行
给你个示例玩家类:
using System; using UnityEngine; [Serializable] public class PlayerData { public string PlayerId; public string Username; public int Level; public int CoinCount; // 比如还有背包数据的话,可以加个可序列化的List或者自定义类 }
2. 选对反序列化工具,两种常用方案
方案一:用Unity自带的JsonUtility
如果你测试的JSON结构和类完全对应,直接用这个最省事,不用额外装包:
// 模拟MySQL查出来的JSON字符串(注意字段名要和类里的完全一致,大小写敏感!) string testJson = "{\"PlayerId\":\"dummy_001\",\"Username\":\"Dummy\",\"Level\":5,\"CoinCount\":1000}"; // 反序列化成PlayerData对象 PlayerData dummyPlayer = JsonUtility.FromJson<PlayerData>(testJson); // 打印验证下有没有成功 if(dummyPlayer != null) { Debug.Log($"Dummy玩家加载成功:{dummyPlayer.Username},等级:{dummyPlayer.Level}"); } else { Debug.LogError("哦豁,反序列化失败了,对象是空的"); }
注意:JsonUtility有点死板,不支持字典,也不支持带参数的构造函数,要是你的玩家数据结构复杂,就得换下面的方案。
方案二:用Newtonsoft.Json(更灵活)
要是你的JSON有嵌套对象、字典这类复杂结构,强烈建议用Newtonsoft,Unity里直接通过Package Manager搜com.unity.nuget.newtonsoft-json就能安装:
using Newtonsoft.Json; // 同样的测试JSON string testJson = "{\"PlayerId\":\"dummy_001\",\"Username\":\"Dummy\",\"Level\":5,\"CoinCount\":1000}"; PlayerData dummyPlayer = JsonConvert.DeserializeObject<PlayerData>(testJson); Debug.Log($"Dummy玩家加载成功:{dummyPlayer.Username}");
这个工具容错性强,支持各种复杂类型,和MySQL返回的JSON适配度更高,毕竟MySQL的JSON字段经常会有灵活的结构。
3. 反序列化失败?排查这几个常见坑
- JSON和类的字段不匹配:比如JSON里是
username全小写,类里是Username首字母大写,大小写敏感直接就认不出来;或者JSON多了/少了字段,JsonUtility会直接返回空对象 - 类没加
[Serializable]标记:用Unity原生工具的话,这个标记是必须的,没加肯定序列化不了 - JSON格式本身错了:比如引号没配对、逗号多了少了,先把测试JSON放到在线JSON校验工具里查一查
- 用了Unity不能序列化的类型:比如把
Texture2D或者GameObject放进玩家类里,这类引用类型没法转成JSON,玩家数据里只存基础数据就行,资源引用可以用ID后续加载
4. 后续登录流程的小建议
等你搞定反序列化之后,登录流程大概可以这么走:
- 玩家输入账号密码,Unity客户端发请求给后端
- 后端查MySQL拿到该玩家的JSON数据(比如从专门存玩家数据的表的JSON字段里读)
- 后端把JSON原封不动返回给Unity
- 客户端把JSON反序列化成
PlayerData对象,传给你的初始化方法就行,比如PlayerManager.InitPlayer(dummyPlayer)
内容的提问来源于stack exchange,提问作者Codinablack
相关产品推荐
相关产品推荐

