使用Newtonsoft Json.NET反序列化Reddit接口返回的复杂JSON数据
基于Newtonsoft Json.NET反序列化Reddit接口复杂JSON的实现方案
你可以按照以下步骤完成复杂结构的反序列化:
步骤1:分层定义对应C#实体类
Reddit的热帖接口返回结构为固定的三层嵌套结构,你可以按需定义需要用到的字段即可,无需映射所有JSON节点:
using Newtonsoft.Json; using System.Collections.Generic; // 最外层根对象 public class RedditRoot { [JsonProperty("kind")] public string Kind { get; set; } [JsonProperty("data")] public RedditRootData Data { get; set; } } // 根节点下的分页、列表包裹层 public class RedditRootData { [JsonProperty("after")] public string NextPageToken { get; set; } [JsonProperty("children")] public List<RedditPostItem> PostList { get; set; } [JsonProperty("dist")] public int PostCount { get; set; } } // 单个帖子的外层包裹 public class RedditPostItem { [JsonProperty("kind")] public string PostType { get; set; } [JsonProperty("data")] public RedditPostCore PostInfo { get; set; } } // 帖子核心数据,按需补充需要的字段即可 public class RedditPostCore { [JsonProperty("title")] public string Title { get; set; } [JsonProperty("author")] public string Author { get; set; } [JsonProperty("ups")] public int UpVoteCount { get; set; } [JsonProperty("selftext")] public string PostContent { get; set; } [JsonProperty("created_utc")] public long PublishTimestamp { get; set; } }
步骤2:执行反序列化操作
拿到接口返回的完整JSON字符串后,直接调用Json.NET的反序列化方法即可:
// 入参jsonStr为从接口请求获取的完整JSON字符串 RedditRoot tf2HotResult = JsonConvert.DeserializeObject<RedditRoot>(jsonStr); // 直接遍历使用数据即可 foreach (var post in tf2HotResult.Data.PostList) { Console.WriteLine($"标题:{post.PostInfo.Title},作者:{post.PostInfo.Author},点赞数:{post.PostInfo.UpVoteCount}"); }
注意事项
- 无需完整定义JSON的所有字段,仅需声明你业务中需要用到的字段即可,未声明的字段Json.NET会自动跳过,不会抛出异常
- 若JSON字段名与C#类的属性名不一致,必须通过
[JsonProperty("原始字段名")]特性做映射,否则会出现字段值为默认空的问题 - 若仅需要提取部分嵌套数据,也可以先用
JObject.Parse(jsonStr)解析为动态对象,直接定位到目标节点后再反序列化为强类型,减少冗余类的定义:// 示例:直接提取帖子列表,不用定义完整根类 JObject root = JObject.Parse(jsonStr); List<RedditPostItem> postList = root["data"]["children"].ToObject<List<RedditPostItem>>();
内容的提问来源于stack exchange,提问作者wholesomedev4
相关产品推荐
相关产品推荐

