C# 使用.Net反序列化JSON只读取JSON文件上的一个对象

C# 使用.Net反序列化JSON只读取JSON文件上的一个对象,c#,.net,json,C#,.net,Json,我正在尝试从如下所示的文件中反序列化json数据。但是我的jsontextreader只读取文件中的一个对象。为什么直到文件结束才读取?当我构建一行json数据并将其输入到我的windows窗体datagridview时,我在这方面没有遇到任何错误 var quotes = new List<Desk.DeskObject>(); var serializer = new JsonSerializer(); using (var reader = new

我正在尝试从如下所示的文件中反序列化json数据。但是我的jsontextreader只读取文件中的一个对象。为什么直到文件结束才读取?当我构建一行json数据并将其输入到我的windows窗体datagridview时,我在这方面没有遇到任何错误

var quotes = new List<Desk.DeskObject>();

       var serializer = new JsonSerializer();
       using (var reader = new StreamReader(@"quotes.json"))
       using (var jsonReader = new JsonTextReader(reader))
       {
            quotes = serializer.Deserialize<List<Desk.DeskObject>>(jsonReader);
       }

您的JSON格式不正确,因此竟然会被解析。 以下是您可能想要的:

[
  {
    "CurrentDate": "09 Feb 2018",
    "CustomerName": "Jonathan Smith",
    "Width": 43,
    "Depth": 43,
    "numOfDrawers": 1,
    "surfMaterial": "Oak",
    "RushOrderDays": 3,
    "TotalQuote": 1339
  },
  {
    "CurrentDate": "09 Feb 2018",
    "CustomerName": "Tim Taylor",
    "Width": 24,
    "Depth": 44,
    "numOfDrawers": 3,
    "surfMaterial": "Laminate",
    "RushOrderDays": 5,
    "TotalQuote": 556
  },
  {
    "CurrentDate": "09 Feb 2018",
    "CustomerName": "Cindy Crawford",
    "Width": 24,
    "Depth": 24,
    "numOfDrawers": 5,
    "surfMaterial": "Pine",
    "RushOrderDays": 5,
    "TotalQuote": 570
  }
]

您没有序列化一个包含3个DeskObject的列表-您的JSON表明您将一个包含1个DeskObject的列表序列化三次

我在这里使用了一些与你的代码相近的东西。如果看不到完整的序列化/对象创建代码,我无法确切地说出发生了什么。但看起来您正在序列化上面评论中的一个DeskObject,而不是一个包含3个DeskObject的列表

在我的示例中,我在列表中内联实例化了3个DeskObjects,如下所示:

List<DeskObject> list = new List<DeskObject>() { new DeskObject(){...}, new DeskObject(){...}, new DeskObject(){...} } ;
然后,在列表完全填满后:

var serializer = new JsonSerializer();
using (StreamWriter file = new StreamWriter(@"quotes.json", false))
                         { serializer.Serialize(file, list); }
这将产生以下JSON:

[
  {
    "CurrentDate": "09 Feb 2018",
    "CustomerName": "Jonathan Smith",
    "Width": 43,
    "Depth": 43,
    "numOfDrawers": 1,
    "surfMaterial": "Oak",
    "RushOrderDays": 3,
    "TotalQuote": 1339
  },
  {
    "CurrentDate": "09 Feb 2018",
    "CustomerName": "Tim Taylor",
    "Width": 24,
    "Depth": 44,
    "numOfDrawers": 3,
    "surfMaterial": "Laminate",
    "RushOrderDays": 5,
    "TotalQuote": 556
  },
  {
    "CurrentDate": "09 Feb 2018",
    "CustomerName": "Cindy Crawford",
    "Width": 24,
    "Depth": 24,
    "numOfDrawers": 5,
    "surfMaterial": "Pine",
    "RushOrderDays": 5,
    "TotalQuote": 570
  }
]
它正确地解析为包含3个桌面对象的列表。我能够设法将类似于您的JSON输入到文件中的唯一方法是使用代码

tl;dr在序列化列表之前,请确保您已填写列表

编辑:

查看您的代码,这是您的问题

 var deskObjects = new List<Desk.DeskObject>();
                deskObjects.Add(deskObject);
                var result = JsonConvert.SerializeObject(deskObject, Formatting.Indented);
File.AppendAllText(@"quotes.json", result);
每次有新报价时,您都要创建一个新列表,并序列化它,然后将其附加到文件中。这意味着您正在将“[{item}]”追加到包含[{item1}][{item2}]等内容的文件中

相反,您需要首先从JSON中读取deskObject列表,这样实际上就有了一个C集合。然后将当前桌面对象添加到其中。最后,再次重写整个文件,不要通过序列化新列表进行追加


我试图在不为您编写代码的情况下将您引导到这一点——您必须理解这样一个概念,即当您调用AppendAllText时,您并不是在JSON树中插入内容。您只是将原始文本添加到包含原始文本的文件的末尾。

您的JSON文件是一个三个列表,而不是一个包含三个项目的列表。因此,您认为这与我如何将数据序列化为文件有关吗???列表对象=新列表;deskObjects.AdddeskObject;var serializer=newjsonserializer;使用StreamWriter file=file。AppendText@quotes.json{serializer.Serializefile,deskObjects;}如果您自己创建文件,则是。要么更改序列化方式,以便在文件中获得一个列表,要么读取到文件末尾并反序列化多个列表-将读取列表添加到总列表中。不要在注释中发布代码块,这很难读取。但看起来一次只能序列化一个对象。将它们全部添加到一个列表中,然后序列化。您可以在线验证您的JSON,例如,在这里[您的失败]如何在每次输入报价时将其添加到列表中?我是否只保留开放的大括号?当我添加到我的列表时,它只会覆盖输入的第一个。如果没有看到如何添加到列表的代码,很难说完整的代码。您是否在每次报价时都使用新列表再次创建列表?在这种情况下,每次这样做都会清空列表。调用“new List”一次,将项目添加到列表1或更多,然后编写JSON。您可以看到我在这两个表单上所做的操作,如果数据的JSON格式正确,{},{}您的StreamWriter不知道您的文件中有什么。它无法检测到您试图将JSON插入现有JSON树的事实。实际上,每次都只是在文件末尾追加一个完整的新JSON对象。与其创建新列表并将其附加到文件,不如读取列表中存在的文件,将新项目添加到该列表中,序列化结果,然后重新生成文件。如果它是文件中的第一个引号,您必须自己用“new”初始化列表。这样,文件中的JSON将正确增长。问题在于,一旦JSON出现在文本文件中,就您的streamwriter/JSON对象而言,它就是文本。因此,您需要在拥有包含更多内容的列表后重新生成JSON,然后重新编写它。我强烈建议将此代码与应用程序的其余部分隔离开来,这样您就不会在任何地方都看到来自JSON代码的重复读取列表。
[
  {
    "CurrentDate": "09 Feb 2018",
    "CustomerName": "Jonathan Smith",
    "Width": 43,
    "Depth": 43,
    "numOfDrawers": 1,
    "surfMaterial": "Oak",
    "RushOrderDays": 3,
    "TotalQuote": 1339
  },
  {
    "CurrentDate": "09 Feb 2018",
    "CustomerName": "Tim Taylor",
    "Width": 24,
    "Depth": 44,
    "numOfDrawers": 3,
    "surfMaterial": "Laminate",
    "RushOrderDays": 5,
    "TotalQuote": 556
  },
  {
    "CurrentDate": "09 Feb 2018",
    "CustomerName": "Cindy Crawford",
    "Width": 24,
    "Depth": 24,
    "numOfDrawers": 5,
    "surfMaterial": "Pine",
    "RushOrderDays": 5,
    "TotalQuote": 570
  }
]
 var deskObjects = new List<Desk.DeskObject>();
                deskObjects.Add(deskObject);
                var result = JsonConvert.SerializeObject(deskObject, Formatting.Indented);
File.AppendAllText(@"quotes.json", result);