Unity中如何用C#反序列化JSON并按Logical字段查询指定数据?
Unity中C#解析JSON并按Logical字段查询值的实现方法
下面提供两种主流方案,分别基于Newtonsoft Json.NET和Unity自带的JsonUtility,实现根据Logical名称查询对应字段值的需求。
方案一:使用Newtonsoft Json.NET
Unity中需先通过Package Manager安装com.unity.nuget.newtonsoft-json包,再按以下方式实现:
方式1:强类型反序列化(推荐,类型安全)
先定义与JSON结构匹配的实体类:
// 顶层JSON结构对应的类 public class EncounterDataRoot { public List<EncounterEntry> Entries { get; set; } } // 单个条目对应的类 public class EncounterEntry { public string Logical { get; set; } public string EncounterType { get; set; } public string EnrageType { get; set; } public int WaitForCameraTime { get; set; } public int OfflineExpireTime { get; set; } public EncounterUI UI { get; set; } } // UI子结构对应的类 public class EncounterUI { public bool UseShocker { get; set; } public bool UseFlashlight { get; set; } }
然后执行解析与查询:
// 替换为你的JSON字符串 string jsonContent = @"{""Entries"": [{""Logical"": ""Easy"",""EncounterType"": ""Standard"",""EnrageType"": ""None"",""WaitForCameraTime"": 30,""OfflineExpireTime"": 60,""UI"": {""UseShocker"": true,""UseFlashlight"": true}},{""Logical"": ""Medium"",""EncounterType"": ""Standard"",""EnrageType"": ""None"",""WaitForCameraTime"": 30,""OfflineExpireTime"": 60,""UI"": {""UseShocker"": true,""UseFlashlight"": true}},{""Logical"": ""Hard"",""EncounterType"": ""Standard"",""EnrageType"": ""None"",""WaitForCameraTime"": 30,""OfflineExpireTime"": 60,""UI"": {""UseShocker"": true,""UseFlashlight"": true}}]}"; // 反序列化到实体类 var dataRoot = JsonConvert.DeserializeObject<EncounterDataRoot>(jsonContent); // 根据Logical名称查找目标条目 var targetEntry = dataRoot.Entries.FirstOrDefault(entry => entry.Logical == "Medium"); // 获取目标字段值 if (targetEntry != null) { int offlineExpireTime = targetEntry.OfflineExpireTime; Debug.Log($"Medium难度的OfflineExpireTime:{offlineExpireTime}"); // 如需获取UI字段,例如UseShocker bool useShocker = targetEntry.UI.UseShocker; } else { Debug.Log("未找到指定Logical的条目"); }
方式2:动态查询(无需定义实体类)
适合临时快速查询场景:
string jsonContent = @"{""Entries"": [{""Logical"": ""Easy"",""EncounterType"": ""Standard"",""EnrageType"": ""None"",""WaitForCameraTime"": 30,""OfflineExpireTime"": 60,""UI"": {""UseShocker"": true,""UseFlashlight"": true}},{""Logical"": ""Medium"",""EncounterType"": ""Standard"",""EnrageType"": ""None"",""WaitForCameraTime"": 30,""OfflineExpireTime"": 60,""UI"": {""UseShocker"": true,""UseFlashlight"": true}},{""Logical"": ""Hard"",""EncounterType"": ""Standard"",""EnrageType"": ""None"",""WaitForCameraTime"": 30,""OfflineExpireTime"": 60,""UI"": {""UseShocker"": true,""UseFlashlight"": true}}]}"; // 解析为JObject JObject jsonObj = JObject.Parse(jsonContent); // 查找Logical为Medium的条目 var targetEntry = jsonObj["Entries"] .FirstOrDefault(item => item["Logical"].ToString() == "Medium"); if (targetEntry != null) { int offlineExpireTime = targetEntry["OfflineExpireTime"].Value<int>(); Debug.Log($"Medium难度的OfflineExpireTime:{offlineExpireTime}"); // 获取UI字段示例 bool useFlashlight = targetEntry["UI"]["UseFlashlight"].Value<bool>(); }
方案二:使用Unity自带JsonUtility
无需额外导入包,适合轻量JSON解析场景,注意类需标记[Serializable],且使用公共字段而非自动属性:
[Serializable] public class EncounterDataRoot { public List<EncounterEntry> Entries; } [Serializable] public class EncounterEntry { public string Logical; public string EncounterType; public string EnrageType; public int WaitForCameraTime; public int OfflineExpireTime; public EncounterUI UI; } [Serializable] public class EncounterUI { public bool UseShocker; public bool UseFlashlight; }
解析与查询代码:
string jsonContent = @"{""Entries"": [{""Logical"": ""Easy"",""EncounterType"": ""Standard"",""EnrageType"": ""None"",""WaitForCameraTime"": 30,""OfflineExpireTime"": 60,""UI"": {""UseShocker"": true,""UseFlashlight"": true}},{""Logical"": ""Medium"",""EncounterType"": ""Standard"",""EnrageType"": ""None"",""WaitForCameraTime"": 30,""OfflineExpireTime"": 60,""UI"": {""UseShocker"": true,""UseFlashlight"": true}},{""Logical"": ""Hard"",""EncounterType"": ""Standard"",""EnrageType"": ""None"",""WaitForCameraTime"": 30,""OfflineExpireTime"": 60,""UI"": {""UseShocker"": true,""UseFlashlight"": true}}]}"; EncounterDataRoot dataRoot = JsonUtility.FromJson<EncounterDataRoot>(jsonContent); var targetEntry = dataRoot.Entries.FirstOrDefault(entry => entry.Logical == "Medium"); if (targetEntry != null) { int offlineExpireTime = targetEntry.OfflineExpireTime; Debug.Log($"Medium难度的OfflineExpireTime:{offlineExpireTime}"); } else { Debug.Log("未找到指定Logical的条目"); }
内容的提问来源于stack exchange,提问作者Orton L Gaming
相关产品推荐
相关产品推荐

