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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:06:52