c# - 在 C# 中反序列化 JSON 文件时出现 StackOverflowException
问题描述
这是我的 Json 文件:
{
"blogPosts": [
{
"id": 1,
"date": "2019-11-11T18:11:22.511Z",
"title": "title1",
"image": "https://www.imageExample.com/static/ae8188adb9e0f13c40fce50bd773bc51/a6b7d/Content-considerations.jpg",
"htmlContent": "htmlExample",
"comments": [
{
"name": "Joe Bloggs",
"date": "2019-11-11T20:44:01.000Z",
"emailAddress": "joeblogs@mailinator.co.uk",
"message": "Sed vel odio consequat, elementum massa quis, lobortis est. Nulla egestas congue dolor, sit amet fermentum massa dignissim sit amet. In vestibulum iaculis egestas."
},
{
"name": "John Smith",
"date": "2019-11-13T09:00:23.533Z",
"emailAddress": "johnsmith@mailinator.co.uk",
"message": "Nam vel aliquet nulla, ac tempor ex. Suspendisse sit amet sollicitudin ex, vel placerat ipsum. Duis vitae fermentum eros. In maximus maximus purus, et volutpat eros rutrum et. Nulla fringilla at massa vel varius. In tristique egestas nisl, vitae elementum orci fringilla quis. Ut rutrum mauris erat, a rhoncus orci posuere non. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus."
},
{
"name": "Jack Black",
"date": "2019-11-11T19:22:22.511Z",
"emailAddress": "jackblack@mailinator.co.uk",
"message": "Integer volutpat, sapien eu dapibus sodales, ipsum arcu dapibus elit, ac faucibus mi ligula suscipit mauris."
}
]
},
{
"id": 2,
"date": "2019-11-01T01:21:39.123Z",
"title": "title2",
"image": "https://www.imageExample.com/static/251940c537d045417ef75286eb970948/f9a6c/Ben.jpg",
"htmlContent": "htmlExample"
},
{
"id": 3,
"date": "2019-10-28T14:53:09.511Z",
"title": "title3",
"image": "https://www.imageExample.com/static/026bfc5011b0f64f2b912fd1d0ef87ae/f9a6c/brno.jpg",
"htmlContent": "htmlExample"
}
]
}
我正在尝试将文件反序列化为这些类:
public class BlogRoot
{
[JsonProperty("blogPosts")]
public List<BlogPost> BlogPosts {get;set;}
}
public class Comment
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("date")]
public DateTime Date { get; set; }
[JsonProperty("emailAddress")]
public string EmailAddress { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
}
public class BlogPost
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("date")]
public DateTime Date { get; set; }
[JsonProperty("title")]
public string Title { get; set; }
[JsonProperty("image")]
public Uri Image { get; set; }
[JsonProperty("htmlContent")]
public string HtmlContent { get; set; }
[JsonProperty("comments", NullValueHandling = NullValueHandling.Ignore)]
public List<Comment> Comments { get; set; }
public BlogPost(int id)
{
LoadBlogPost(id);
}
private List<BlogPost> LoadBlogPost(int id)
{
string path = HostingEnvironment.MapPath(@"~\App_Data\Blog-Posts - Copy.json");
string jsonFromFile;
using (StreamReader reader = File.OpenText(path))
{
jsonFromFile = reader.ReadToEnd();
var root = JsonConvert.DeserializeObject<BlogRoot>(jsonFromFile);
return root.BlogPosts;
}
}
}
当我尝试反序列化 Json 文件时,我得到一个 StackOverflowException,我不知道为什么。我在网上找不到任何解决方案,我一直在努力找出原因,这可能是我完全忽略的非常明显的事情。有趣的是,我可以将 Json 反序列化为动态数组,但我只想能够反序列化为这些类。有任何想法吗?
调用堆栈:
> Web.dll!Web.Business.BlogPost.LoadBlogPost(int id) Line 39 C#
Web.dll!Web.Business.BlogPost.BlogPost(int id) Line 34 C#
[External Code]
Web.dll!Web.Business.BlogPost.LoadBlogPost(int id) Line 47 C#
Web.dll!Web.Business.BlogPost.BlogPost(int id) Line 34 C#
[External Code]
Web.dll!Web.Business.BlogPost.LoadBlogPost(int id) Line 47 C#
Web.dll!Web.Business.BlogPost.BlogPost(int id) Line 34 C#
[External Code]
Web.dll!Web.Business.BlogPost.LoadBlogPost(int id) Line 47 C#
Web.dll!Web.Business.BlogPost.BlogPost(int id) Line 34 C#
[External Code]
Web.dll!Web.Business.BlogPost.LoadBlogPost(int id) Line 47 C#
它比这更长,但它只是重复这些行。
错误消息实际上只是 System.StackOverflowException,没有额外的细节。
解决方案
问题是你在构造函数中调用LoadBlogPost()
你的类BlogPost
,然后你List<BlogPost>
的BlogRoot
. 反序列化尝试在您的 json 中创建一个新的BlogPost
foreach blogPost-Element,因此再次调用构造函数,该构造函数再次调用反序列化。
你有你的无限循环;-)
您可以改为删除构造函数中的代码并创建一个静态类方法来生成您的列表:
public BlogPost()
{
}
public static List<BlogPost> LoadBlogPost(int id)
{
string path = "my.xml";
string jsonFromFile;
using (StreamReader reader = File.OpenText(path))
{
jsonFromFile = reader.ReadToEnd();
var root = JsonConvert.DeserializeObject<BlogRoot>(jsonFromFile);
return root.BlogPosts;
}
}
然后像这样调用它:
var blogPosts = BlogPost.LoadBlogPost(0);
推荐阅读
- python - 我想从 HTML 中抓取数据并将其转换为 pandas DataDrame 最后将其存储为 aCSV 文件
- unity3d - 为什么刚体上的 OnMouseDown() 事件不会触发?
- laravel - 每个租户的多租户和自定义功能
- sql - 仅显示 MAX 行
- algorithm - 图中所有可能的路径
- arrays - 如何在执行快速排序时正确找到枢轴元素?
- javascript - 数字计数器将数字从 1 增加到最大值,然后从该值减少到 1。但它应该增加然后停止
- c# - C# 将 bool 重新解释为 byte/int(无分支)
- android - 无法使用 react-native start 捆绑应用程序
- c++ - 检测到子进程因操作系统内存不足而被杀死