C# Json格式在保存后中断
所以我有一个带列表的应用程序。我将这个列表存储在一个json文件中,当应用程序运行时,我对列表进行更改,并将其保存为磁盘上的.json文件 在用户关闭应用程序之前,我想重置一些值。在应用程序关闭之前的保存中,json的格式没有正确保存。导致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) {
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
。是的,我只是每次都覆盖所有数据。啊,太好了,这很管用。我将用这两种解决方案四处寻找,看看什么最适合这里。非常感谢。