JSON使用.Net反序列化只读取我的json文件中的一个对象

时间:2018-02-10 15:29:12

标签: c# .net json

我正在尝试从下面显示的文件中反序列化我的json数据。但我的jsontextreader只读取文件中的一个对象。为什么直到文件结尾才读?当我构建并输入一行json数据到我的windows form 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
  }
]

2 个答案:

答案 0 :(得分:1)

您没有序列化3个DeskObjects的列表 - 您的JSON建议您三次序列化1个DeskObject的列表。

我在code中使用了与您的代码相近的内容。在没有看到完整的序列化/对象创建代码的情况下,我无法准确地告诉您发生了什么。但看起来您正在上面的注释中序列化一个DeskObject而不是3个DeskObject的列表。

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

List<DeskObject> list = new List<DeskObject>() { new DeskObject(){...}, new DeskObject(){...}, new DeskObject(){...} } ;

您也可以创建DeskObjects并将它们放入列表中,前提是它们已经创建过:

list.Add(myDeskObject1);
list.Add(myDeskObject2);
list.Add(myDeskObject3);

然后,在列表完全填满之后:

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个DeskObjects的列表。我可以设法将像您这样的JSON加入文件的唯一方法是使用this代码。

tl; dr确保在序列化之前填写列表。

修改

检查您的代码,这是您的问题。

 var deskObjects = new List<Desk.DeskObject>();
                deskObjects.Add(deskObject);
                var result = JsonConvert.SerializeObject(deskObject, Formatting.Indented);
File.AppendAllText(@"quotes.json", result);

每次有新报价时,您都会创建一个新列表,并对其进行序列化,然后将其附加到文件中。这意味着您要附加&#39; [{item}]&#39;到包含[{item1}] [{item2}]等的文件

相反,您需要首先从JSON中读取DeskObjects列表,以便您实际拥有C#集合。然后将当前的DeskObject添加到它。最后,通过序列化新列表再次重写整个文件(不要追加)。

我试图在没有为您编写代码的情况下指导您 - 重要的是您理解当您调用AppendAllText时,您没有在JSON树中插入内容的概念。您只是将原始文本附加到包含原始文本的文件的末尾。

答案 1 :(得分:0)

您的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
  }
]