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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:54:35