我使用以下代码将对象序列化为 .txt 文件中的 JSON 字符串:
private void ReserveTable_Click(object sender, EventArgs e)
{
Reservation CreateReservation = new Reservation(textBoxFirstName.Text, textBoxSecondName.Text, dateTimePickerDate.Value.ToShortDateString(), comboBoxTable.Text, 5, textBoxPhoneNumber.Text);
string jsonString = JsonSerializer.Serialize(CreateReservation);
File.AppendAllText(Globals.filepath, jsonString);
}
它在该文件中创建多个 json 字符串,如下所示:
{"Firstname":"Rainer","Lastname":"Maier","Date":"07.07.2022","Table":"Tisch 8 (Au\u00DFenbereich)","NumberOfPersons":5,"Phonenumber":"4756465465"}{"Firstname":"Timo","Lastname":"Winkler","Date":"07.07.2022","Table":"Tisch 8 (Au\u00DFenbereich)","NumberOfPersons":5,"Phonenumber":"5674654"}
然后我尝试反序列化文件,将属性放入表中:
private void ShowReservation_Click(object sender, EventArgs e)
{
string jsonString = File.ReadAllText(Globals.filepath);
Reservation ReadReservation = JsonSerializer.Deserialize<Reservation>(jsonString)!;
Console.WriteLine(ReadReservation);
}
我无法反序列化这两个对象。错误代码:
“{”在单个 JSON 值后无效。预计数据结束。
有什么方法可以反序列化多个对象或更智能地序列化它吗?在此程序中,您可以创建多个需要存储在文件中的预订。
最佳答案
问题是 JSON 格式的项目集合不是通过获取单个序列化项目并将它们一个接一个地附加来表示的(就像在您的输出示例中一样)。您想要的是 JSON 格式的集合,它应该如下所示:
[{"Firstname":"Rainer","Lastname":"Maier","Date":"07.07.2022","Table":"Tisch 8 (Au\u00DFenbereich)","NumberOfPersons":5,"Phonenumber":"4756465465"},{"Firstname":"Timo","Lastname":"Winkler","Date":"07.07.2022","Table":"Tisch 8 (Au\u00DFenbereich)","NumberOfPersons":5,"Phonenumber":"5674654"}]
注意方括号(表示数组)和分隔每个对象的逗号。然后,您可以使用如下内容反序列化该文件:
Reservations List<ReadReservation> = JsonSerializer.Deserialize<List<Reservation>>(jsonString);
解决问题的最简单方法不是使用追加,而是反序列化文件内容,将项目添加到列表中,然后将集合序列化回来。如果性能是一个问题,那么更好的方法是使用换行符(或一些分隔值)进行附加,然后使用读取器读取各个 block 并将它们逐个反序列化。
关于c# - 从文件 C# 反序列化多个 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72860012/