C#如何获取多维JSON中的键值?(基于Newtonsoft.Json)
解决嵌套JSON的取值问题
嘿,别担心哈,新手刚接触JSON序列化遇到这种嵌套问题太正常了!我来帮你一步步理清楚~
你现在遇到的核心问题是:你的外层字典里,键"1"对应的value本身是一个完整的JSON字符串,而不是直接的对象。所以序列化后它会被当成普通字符串处理(带转义符),想要拿到里面的characterId、name这些值,得先把这个内层的JSON字符串反序列化才行。
第一步:定义对应内层JSON的实体类(推荐方式)
首先我们可以先定义一个和内层JSON结构匹配的类,这样取值会更清晰、类型更安全:
public class PlayerInfo { public int characterId { get; set; } public int connectionId { get; set; } public int accountId { get; set; } public string name { get; set; } public int level { get; set; } // 记得根据你实际的JSON内容补充其他属性哦 }
场景1:直接从原playerData字典处理(更高效)
既然你已经有了原字典playerData,其实不用先序列化再解析,直接从字典里拿到内层JSON字符串再反序列化就好:
public void SpawnPlayer(Dictionary<string, string> playerData, int cnnId) { // 先尝试获取键"1"对应的内层JSON字符串 if (playerData.TryGetValue("1", out string innerJson)) { // 把内层JSON反序列化为PlayerInfo对象 PlayerInfo playerInfo = JsonConvert.DeserializeObject<PlayerInfo>(innerJson); // 现在就可以直接通过属性取值啦! Console.WriteLine($"角色ID:{playerInfo.characterId}"); Console.WriteLine($"玩家名称:{playerInfo.name}"); Console.WriteLine($"等级:{playerInfo.level}"); Console.WriteLine($"连接ID:{playerInfo.connectionId}"); } else { Console.WriteLine("找不到键为\"1\"的玩家数据哦"); } }
场景2:从已序列化的jsonData字符串解析
如果已经拿到了序列化后的jsonData,也可以先解析外层字典,再处理内层:
public void SpawnPlayer(Dictionary<string, string> playerData, int cnnId) { string jsonData = JsonConvert.SerializeObject(playerData, Formatting.None); Console.WriteLine(jsonData); // 先把外层JSON反序列化为字典 var outerDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonData); if (outerDictionary.TryGetValue("1", out string innerJson)) { PlayerInfo playerInfo = JsonConvert.DeserializeObject<PlayerInfo>(innerJson); // 取值示例 Console.WriteLine($"账号ID:{playerInfo.accountId}"); } }
备选方案:不用实体类,动态取值
如果不想定义实体类,也可以用JObject来动态解析内层JSON:
// 拿到innerJson之后 JObject playerObj = JObject.Parse(innerJson); string playerName = (string)playerObj["name"]; int playerLevel = (int)playerObj["level"]; // 以此类推取其他键值
小提醒
为什么会出现这种嵌套带转义的JSON呢?因为你的playerData是Dictionary<string, string>类型,Newtonsoft.Json会把字典里的所有value都当成普通字符串处理,哪怕这个字符串本身是JSON,也会自动加上转义符(比如\"、\r\n)来保证外层JSON的格式正确。所以必须多一步内层的反序列化操作~
内容的提问来源于stack exchange,提问作者Venelin
相关产品推荐
相关产品推荐

