我正在List<UserDataJson>使用 Newtonsoft.JSON序列化 a然后寫入檔案。這是課程:
private class UserDataJson
{
public UserDataJson() { }
public UserDataJson(string path)
{
Location = path;
Opacity = 1;
}
public UserDataJson(IUserData userData)
{
Location = userData.Location;
Opacity = userData.Opacity;
}
public string Location { get; set; }
public double Opacity { get; set; }
}
序列化和寫入的代碼:
private static readonly string _userDataFile = Path.Combine(_programDataFolder, "userdata.json");
...
public void SaveData(IReadOnlyCollection<IUserData> userData)
{
File.WriteAllText(_userDataFile, JsonConvert.SerializeObject(userData.Select(Serialize).ToList(), Formatting.Indented));
}
private static string Serialize(IUserData userData) => JsonConvert.SerializeObject(new UserDataJson(userData));
使用一個元素,這會生成一個如下所示的_userDataJson檔案:
[
"{\"Location\":\"C:\\\\Users\\\\me\\\\Documents\\\\test.txt\",\"Opacity\":1.0}"
]
但是,當我嘗試反序列化時,我得到一個JsonSerializationException:
反序列化:
JsonConvert.DeserializeObject<List<UserDataJson>>(File.ReadAllText(_userDataFile).Replace("\\\\", "\\");
例外:
{"Error converting value \"{\"Location\":\"C:\\Users\\me\\Documents\\test.txt\",\"Opacity\":1.0}\" to type 'Company.App.Wpf.MainWindow.UserDataService UserDataJson'. Path '[0]', line 2, position 73."}
內部例外:
"Could not cast or convert from System.String to Company.App.Wpf.MainWindow.UserDataService UserDataJson."
但是,當我\從雙引號中洗掉轉義字符并從整個物件周圍洗掉雙引號時,它會很好地反序列化。
[
{"Location":"C:\\\\Users\\\\me\\\\Documents\\\\test.txt","Opacity":1.0}
]
在序列化或反序列化階段是否應該應用任何配置以生成可以反序列化為UserDataJson?
uj5u.com熱心網友回復:
假設您獲取一個物件,并將其序列化為 JSON。你得到一個字串,對吧?因此,如果將該字串添加到串列中并序列化該串列,則會得到類似于上面的 JSON 的內容。
這是因為你的序列化這部分代碼的:.Select(Serialize)。這一步似乎完全沒有必要。
洗掉它,我們得到這個:
public void SaveData(IReadOnlyCollection<IUserData> userData)
{
File.WriteAllText(_userDataFile, JsonConvert.SerializeObject(userData, Formatting.Indented));
}
private static string Serialize(IUserData userData) => JsonConvert.SerializeObject(new UserDataJson(userData));
這段代碼現在應該可以反序列化生成的 JSON:
var result = JsonConvert.DeserializeObject<List<UserDataJson>>(File.ReadAllText(_userDataFile));
網上試試
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/343640.html
