使用Newtonsoft反序列化含动态键的JSON中Channels节点失败求助
解决Newtonsoft.Json反序列化可变数字键节点的问题
核心解决方案
针对键为可变数字字符串的channels节点,无需尝试用固定类属性映射,直接用Dictionary<string, 频道实体类>或Dictionary<int, 频道实体类>替代即可——Newtonsoft.Json会自动将动态键值对解析为字典的键值集合。
修改实体类
原错误写法示例(参考)
假设你之前的实体类结构类似:
public class Categories { public List<Series> series { get; set; } public List<Movies> movies { get; set; } public List<Live> live { get; set; } // 无法解析动态键的错误写法 public Channels channels { get; set; } } public class Channels { // 无法定义可变数字键对应的属性 }
修改后的正确实体类
public class Categories { public List<Series> series { get; set; } public List<Movies> movies { get; set; } public List<Live> live { get; set; } // 用字典接收动态数字键的节点 public Dictionary<string, ChannelItem> channels { get; set; } } // 单个频道的实体类,对应JSON中每个数字键的内容 public class ChannelItem { // 根据你的JSON结构定义字段,示例: public string name { get; set; } public string url { get; set; } // 其他需要解析的字段... }
如果JSON中的数字键可以安全转换为整数,也可以使用Dictionary<int, ChannelItem>,Newtonsoft.Json会自动完成键类型的转换。
反序列化代码示例
保持常规反序列化逻辑即可,无需额外配置:
// 读取JSON文件内容 string jsonContent = File.ReadAllText("你的JSON文件路径"); // 反序列化为根实体类(根类需包含user_info、server_info、categories属性) var rootObj = JsonConvert.DeserializeObject<RootObject>(jsonContent); // 遍历channels字典处理数据 foreach (var channelKvp in rootObj.categories.channels) { string channelId = channelKvp.Key; ChannelItem channelData = channelKvp.Value; // 后续业务处理逻辑 }
匹配JSON结构验证
确保你的JSON中channels节点为键值对形式,示例:
{ "user_info": {...}, "server_info": {...}, "categories": { "series": [...], "movies": [...], "live": [...], "channels": { "1": {"name": "测试频道1", "url": "http://example.com/1"}, "5": {"name": "测试频道5", "url": "http://example.com/5"}, "12": {"name": "测试频道12", "url": "http://example.com/12"} } } }
之前用[JsonProperty]无效是因为该特性仅适用于固定键名的映射,动态键场景必须依赖字典类型来接收。
内容的提问来源于stack exchange,提问作者A de V.
相关产品推荐
相关产品推荐

