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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:11:15