我正在尝试从下面显示的文件中反序列化我的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
}
]
答案 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
}
]