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

如何在C#中反序列化含动态键的JSON响应?

问题解决:C#处理JSON动态键(Haythandi/Beautifulnari作为动态ID)

问题背景

现有从JSON转换生成的C#类中,Haythandi和Beautifulnari被定义为固定类名,但实际上它们是响应JSON中的动态记录ID,而非固定结构。需要将这类动态键转换为可灵活处理的C#结构。

解决方案

核心思路:识别动态键对应的统一数据结构,用字典或JObject承载动态键值对,替代硬编码的固定类。

步骤1:定义通用数据结构

观察Haythandi和Beautifulnari的结构,两者完全一致,因此定义一个通用类来复用结构:

public class UserPostData
{
    public List<Post> posts { get; set; }
    public long totalViewsCount { get; set; }
}

注:保留原有的Post及其他依赖类(如Accessibility、MediaLocation等)不变。

步骤2:修改Root类适配动态键

将原Datum类替换为Dictionary<string, UserPostData>,因为每个data元素本质是一个动态键值对集合:

public class Root
{
    public int code { get; set; }
    // 每个data元素存储动态ID与对应帖子数据的映射
    public List<Dictionary<string, UserPostData>> data { get; set; }
    public string message { get; set; }
    public bool hasmoreData { get; set; }
    public object error { get; set; }
}

删除原有的Haythandi和Beautifulnari类,无需保留。

步骤3:反序列化与数据遍历

使用Newtonsoft.Json进行反序列化,并遍历动态键值对:

// 反序列化JSON响应
var root = JsonConvert.DeserializeObject<Root>(myJsonResponse);

// 遍历所有动态数据项
foreach (var userDataDict in root.data)
{
    foreach (var kvp in userDataDict)
    {
        string recordId = kvp.Key; // 获取动态ID(如Haythandi、Beautifulnari)
        UserPostData postData = kvp.Value; // 获取对应的帖子数据
        
        // 业务处理示例
        Console.WriteLine($"记录ID: {recordId}");
        Console.WriteLine($"总浏览量: {postData.totalViewsCount}");
        foreach (var post in postData.posts)
        {
            // 处理单个帖子逻辑
        }
    }
}

备选方案:使用JObject手动解析

如果不想修改实体类,也可以直接用JObject解析动态键:

var jObject = JObject.Parse(myJsonResponse);
var dataArray = jObject["data"] as JArray;

foreach (var dataItem in dataArray)
{
    // 遍历每个动态键值对
    foreach (var prop in dataItem.Properties())
    {
        string recordId = prop.Name;
        UserPostData postData = prop.Value.ToObject<UserPostData>();
        
        // 后续处理逻辑同上
    }
}

说明

  • 避免硬编码动态ID为类名,通过通用类+字典的方式适配任意动态键;
  • 确保UserPostData的结构与动态键对应JSON对象的结构完全匹配,否则反序列化会失败;
  • 若动态键对应的结构可能不一致,可改用Dictionary<string, JObject>先接收,再按需解析。

内容的提问来源于stack exchange,提问作者Omkar P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:10:39