C#中使用Newtonsoft JSON Compact反序列化类数组非数组JSON结构
嘿,看起来你确实把问题想复杂了——这种带动态键的JSON用Newtonsoft.Json(也就是大家常说的Json.NET)处理其实挺直接的,我来给你捋清楚步骤:
用Newtonsoft.Json解析动态键的通知JSON
首先,我们要匹配JSON的结构来定义对应的C#类,你的JSON里http和sip这类分类下,都是动态ID作为键的通知集合,每个通知包含title和value两个字段。
1. 定义实体类
先写最基础的单个通知类,对应JSON里的单个通知结构:
public class Notification { // Json.NET默认会自动匹配JSON里的小写键(title/value)和C#的大写属性名 public string Title { get; set; } public string Value { get; set; } }
接下来分两种情况定义外层结构:
- 如果
http、sip这些分类是固定的,就用明确的容器类:public class NotificationContainer { public Dictionary<string, Notification> Http { get; set; } public Dictionary<string, Notification> Sip { get; set; } } - 如果未来可能出现更多未知分类(比如除了http、sip还有其他类型),可以直接用嵌套字典接收整个JSON,灵活性更高:
// 这种方式无需定义外层容器类,直接解析成嵌套字典 var allNotifications = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, Notification>>>(jsonString);
2. 解析JSON并操作数据
假设你已经拿到了目标JSON字符串,用JsonConvert.DeserializeObject就能完成解析:
方式一:用固定容器类(适用于分类明确的场景)
string rawJson = @"{""http"":{""0"":{""title"":""arbitrary"",""value"":""arbitrary""},""1"":{""title"":""arbitrary"",""value"":""arbitrary""}},""sip"":{""1003"":{""title"":""arbitrary"",""value"":""none""}}}"; // 解析到容器类 var container = JsonConvert.DeserializeObject<NotificationContainer>(rawJson); // 遍历HTTP分类下的所有通知 foreach (var (notificationId, notification) in container.Http) { Console.WriteLine($"HTTP通知ID {notificationId}: 标题={notification.Title}, 内容={notification.Value}"); } // 遍历SIP分类下的所有通知 foreach (var (notificationId, notification) in container.Sip) { Console.WriteLine($"SIP通知ID {notificationId}: 标题={notification.Title}, 内容={notification.Value}"); }
方式二:用嵌套字典(适用于动态分类场景)
var allNotifications = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, Notification>>>(rawJson); // 遍历所有分类 foreach (var (category, notifications) in allNotifications) { Console.WriteLine($"\n=== {category.ToUpper()} 通知列表 ==="); // 遍历当前分类下的所有通知 foreach (var (id, notify) in notifications) { Console.WriteLine($"ID {id}: 标题={notify.Title}, 内容={notify.Value}"); } }
3. 关键注意事项
- 确保你已经安装了Newtonsoft.Json包:如果用NuGet包管理器,搜索安装
Newtonsoft.Json;如果是.NET CLI,执行命令dotnet add package Newtonsoft.Json。 - 如果所有ID都是纯数字(比如"0"、"1003"),你也可以把字典的键类型改成
int(比如Dictionary<int, Notification>),Json.NET会自动完成字符串到数字的转换,前提是所有ID都是有效的数字格式。
这样处理下来,就能轻松把你那串JSON转成C#里可操作的对象了,完全不用把问题复杂化~
内容的提问来源于stack exchange,提问作者Lincoln King-Cliby
相关产品推荐
相关产品推荐

