C# Json格式在保存后中断

C# Json格式在保存后中断,c#,json,wpf,json.net,filestream,C#,Json,Wpf,Json.net,Filestream,所以我有一个带列表的应用程序。我将这个列表存储在一个json文件中,当应用程序运行时,我对列表进行更改,并将其保存为磁盘上的.json文件 在用户关闭应用程序之前,我想重置一些值。在应用程序关闭之前的保存中,json的格式没有正确保存。导致json文件无效 关闭: private void btnClose_Click(object sender, RoutedEventArgs e) { foreach (var customer in _currentCustomers) {

所以我有一个带列表的应用程序。我将这个列表存储在一个json文件中,当应用程序运行时,我对列表进行更改,并将其保存为磁盘上的.json文件

在用户关闭应用程序之前,我想重置一些值。在应用程序关闭之前的保存中,json的格式没有正确保存。导致json文件无效

关闭:

private void btnClose_Click(object sender, RoutedEventArgs e)
{
   foreach (var customer in _currentCustomers) {
      customer.State = TransferState.None;
      customer.NextScan = String.Empty;
   }
   WriteCustomerList();
   this.Close();
}
try
{
      using (var fileStream = new FileStream(_appConfigLocation, FileMode.OpenOrCreate, FileAccess.Write))
     {
        using (var br = new BinaryWriter(fileStream))
        {

           br.Write(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_currentCustomers)));

         }
      }
}
catch (Exception ex)
{
        System.Windows.MessageBox.Show("Failed to write customer list./n/n" + ex.Message, "Error!");
}
[{
    "Username": "xxxxx",
    "Password": "xxxx",
    "RelationNumber": "xxxx",
    "State": 3,
    "NextScan": "",
    "Interval": 1
}]
[{
    "Username": "xxx",
    "Password": "xxxx",
    "RelationNumber": "xxxx",
    "State": 3,
    "NextScan": "",
    "Interval": 1
}]26","Interval":1}]
WriteCustomerList方法:

private void btnClose_Click(object sender, RoutedEventArgs e)
{
   foreach (var customer in _currentCustomers) {
      customer.State = TransferState.None;
      customer.NextScan = String.Empty;
   }
   WriteCustomerList();
   this.Close();
}
try
{
      using (var fileStream = new FileStream(_appConfigLocation, FileMode.OpenOrCreate, FileAccess.Write))
     {
        using (var br = new BinaryWriter(fileStream))
        {

           br.Write(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_currentCustomers)));

         }
      }
}
catch (Exception ex)
{
        System.Windows.MessageBox.Show("Failed to write customer list./n/n" + ex.Message, "Error!");
}
[{
    "Username": "xxxxx",
    "Password": "xxxx",
    "RelationNumber": "xxxx",
    "State": 3,
    "NextScan": "",
    "Interval": 1
}]
[{
    "Username": "xxx",
    "Password": "xxxx",
    "RelationNumber": "xxxx",
    "State": 3,
    "NextScan": "",
    "Interval": 1
}]26","Interval":1}]
正确的Json:

private void btnClose_Click(object sender, RoutedEventArgs e)
{
   foreach (var customer in _currentCustomers) {
      customer.State = TransferState.None;
      customer.NextScan = String.Empty;
   }
   WriteCustomerList();
   this.Close();
}
try
{
      using (var fileStream = new FileStream(_appConfigLocation, FileMode.OpenOrCreate, FileAccess.Write))
     {
        using (var br = new BinaryWriter(fileStream))
        {

           br.Write(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_currentCustomers)));

         }
      }
}
catch (Exception ex)
{
        System.Windows.MessageBox.Show("Failed to write customer list./n/n" + ex.Message, "Error!");
}
[{
    "Username": "xxxxx",
    "Password": "xxxx",
    "RelationNumber": "xxxx",
    "State": 3,
    "NextScan": "",
    "Interval": 1
}]
[{
    "Username": "xxx",
    "Password": "xxxx",
    "RelationNumber": "xxxx",
    "State": 3,
    "NextScan": "",
    "Interval": 1
}]26","Interval":1}]
关闭后的Json:

private void btnClose_Click(object sender, RoutedEventArgs e)
{
   foreach (var customer in _currentCustomers) {
      customer.State = TransferState.None;
      customer.NextScan = String.Empty;
   }
   WriteCustomerList();
   this.Close();
}
try
{
      using (var fileStream = new FileStream(_appConfigLocation, FileMode.OpenOrCreate, FileAccess.Write))
     {
        using (var br = new BinaryWriter(fileStream))
        {

           br.Write(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(_currentCustomers)));

         }
      }
}
catch (Exception ex)
{
        System.Windows.MessageBox.Show("Failed to write customer list./n/n" + ex.Message, "Error!");
}
[{
    "Username": "xxxxx",
    "Password": "xxxx",
    "RelationNumber": "xxxx",
    "State": 3,
    "NextScan": "",
    "Interval": 1
}]
[{
    "Username": "xxx",
    "Password": "xxxx",
    "RelationNumber": "xxxx",
    "State": 3,
    "NextScan": "",
    "Interval": 1
}]26","Interval":1}]

您不会截断文件,所以之前的内容仍然存在(导致在第一个
]
之后的内容)

在您的情况下,使用更安全、更短的解决方案:

File.WriteAllText(_appConfigLocation,
     JsonConvert.SerializeObject(_currentCustomers));

如果您需要更多的控制,请使用
FileMode.Truncate
或中建议的其他方法。

您是否每次都写入所有数据?如果是这样,如果文件长度超过您正在写入的新数据,则文件模式.OpenOrCreate可能会出现问题。你可能需要
FileMode.Truncate
。是的,我只是每次都覆盖所有数据。啊,太好了,这很管用。我将用这两种解决方案四处寻找,看看什么最适合这里。非常感谢。