C# 在C中反序列化JSON文件时的StackOverflowException#

C# 在C中反序列化JSON文件时的StackOverflowException#,c#,json,C#,Json,这是我的Json文件: { "blogPosts": [ { "id": 1, "date": "2019-11-11T18:11:22.511Z", "title": "title1", "image": "https://www.imageExample.com/static/ae81

这是我的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;
        }
    }
}
它比这个长,但它只是重复这些线


错误消息实际上只是System.StackOverflowException,没有额外的详细信息。

问题是在构造函数中调用类
BlogPost的
LoadBlogPost()
,然后在
BlogRoot
中有一个
列表。
反序列化尝试在json中创建一个新的
BlogPost
foreach BlogPost元素,因此再次调用构造函数,构造函数再次调用反序列化

这就是你的无限循环;-)

您可以删除构造函数中的代码,并生成生成列表的静态类方法:

    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;
        }
    }

也许是因为你

public BlogPost(int id)
{
    LoadBlogPost(id);  // <-- problem...
}
公共博客帖子(int-id)
{

LoadBlogPost(id);//Boom,堆栈溢出。

反序列化应该在对象之外。您可以执行以下操作:

var blogPosts = BlogPost.LoadBlogPost(0);
var json = File.ReadAllText("json1.json");
var root = JsonConvert.DeserializeObject<BlogRoot>(json);
var blog = root.BlogPosts.Where(b => b.Id == 1).FirstOrDefault();
var json=File.ReadAllText(“json1.json”);
var root=JsonConvert.DeserializeObject(json);
var blog=root.BlogPosts.Where(b=>b.Id==1.FirstOrDefault();

您正试图反序列化多少数据?确切的错误是什么,调用堆栈显示了什么?堆栈只是从
反序列化对象
,然后进入JSON.NET库吗?发现了类似的情况。在
LoadBlogPost
中放置一个断点,看看发生了什么。您会感到惊讶。看看,它是如何在betwe中来回运行的在这两行?这表示一行正在调用另一行。每次,堆栈中都会消耗一点内存,直到没有可用的堆栈。猜猜会发生什么?;)OP:你可以完全忽略id,顺便说一句。它是未使用的。这真的帮助了我,谢谢!我完全可以看到我是如何创建无限循环的现在,我把自己弄糊涂了,认为我需要在构造函数中对BlogPost进行反序列化,然后设置属性,而没有想到反序列化程序会为我设置所有属性。
var json = File.ReadAllText("json1.json");
var root = JsonConvert.DeserializeObject<BlogRoot>(json);
var blog = root.BlogPosts.Where(b => b.Id == 1).FirstOrDefault();