如何在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
相关产品推荐
相关产品推荐

