c# - 从文件 C# 反序列化多个 JSON 对象

标签 c# loops deserialization

我使用以下代码将对象序列化为 .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/

相关文章:

serialization - Protobuf 将序列化消息串联到一个文件中

c# - 当 Microsoft SQL Server 中包含 html 标签时对列进行排序

c# - 在 C# 项目中管理数据库更改

c# - 更改DataGridView的Cell Enter事件中的当前单元格

python - 在两个列表中迭代递增的值

java - 为什么不能调用已经在循环中初始化并预先声明的变量?

c# - 反序列化两个略有不同的JSON字符串(结构相同,名称不同)到同一个类

c# - 在运行时保持 C# 和 C++ 类同步?

java - 如何在我的主要 Activity 中循环一段代码?

jquery - MVC JavaScriptSerializer反序列化json