2015-05-28 62 views
1

所以我有一個List應用程序。我將這個List存儲在一個json文件中,當應用程序正在運行時,我對列表進行更改並將其保存爲磁盤上的.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(); 
} 

WriteCustomerList方法:

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!"); 
} 

正確的JSON:

[{ 
    "Username": "xxxxx", 
    "Password": "xxxx", 
    "RelationNumber": "xxxx", 
    "State": 3, 
    "NextScan": "", 
    "Interval": 1 
}] 

的Json閉幕後:

[{ 
    "Username": "xxx", 
    "Password": "xxxx", 
    "RelationNumber": "xxxx", 
    "State": 3, 
    "NextScan": "", 
    "Interval": 1 
}]26","Interval":1}] 
+0

您是否每次寫入所有數據?如果是這樣,如果文件的長度超過了正在寫入的新數據,FileMode.OpenOrCreate可能會成爲問題。你可能會想'FileMode.Truncate'。 – crashmstr

+0

是的,我只是每次覆蓋所有的數據。 –

回答

3

你不截斷文件,因此以前的內容仍然存在(導致無論是第一]後)。

在使用File.WriteAllText你的情況可能會更安全和更短的解決方案:

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

如果您需要更多的控制 - 使用FileMode.TruncateHow to truncate a file in c#?推薦的其他方法。

+0

啊,這件作品很棒。我會用這兩種解決方案來付出代價,看看這裏最適合什麼。謝謝! –