我已花了大約一天的時間。如果我有一個像JSON日期時間這樣的簡單對象集合,我可以將它正確地反序列化爲有效的對象和錯誤。對於更復雜的對象集合使用完全相同的方法會給我提供完全不同的結果:帶有問題的一個對象會停止正確創建所有其他對象。我嘗試了各種其他方法,例如使用JsonTextReader來瀏覽json查找對象,但它永遠不能通過錯誤的布爾值'tru'。JSON.NET中對象集合的錯誤處理行爲與簡單類型相比有所不同
基本上我想能夠反序列化所有的好值並跳過不好的值。
我在有關這種行爲差異的文檔中找不到任何內容。我也看了各種與解析和處理錯誤沒有運氣相關的stackoverflow文章。任何見解都非常感謝。
在這段代碼中,你會得到3個很好的日期和3個錯誤。
private void WorkingDeserializer()
{
List<string> errors = new List<string>();
List<DateTime> c = JsonConvert.DeserializeObject<List<DateTime>>(
@"[
'2009-09-09T00:00:00Z',
'I am not a date and will error!',
[
1
],
'1977-02-20T00:00:00Z',
null,
'2000-12-01T00:00:00Z'
]",
new JsonSerializerSettings
{
Error = delegate(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
}
});
}
在這段代碼中你沒有得到任何好的價值觀,錯誤
public class FeatureSwitch
{
public string Name { get; set; }
public string Description { get; set; }
public bool Status { get; set; }
}
private void NonWorkingDeserializer()
{
List<string> errors = new List<string>();
List<FeatureSwitch> c = JsonConvert.DeserializeObject<List<FeatureSwitch>>(
@"[
{
'Name': 'TestSwitch1',
'Description': 'TestSwitch1_Desc',
'Status': false
},
{
'Name': 'TestSwitch2',
'Description': 'bad format',
'Status': tru
},
{
'Name': 'TestSwitch3',
'Description': 'should be good',
'Status': true
}
]", new JsonSerializerSettings
{
Error = delegate(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
}
});
}
感謝您的回覆,我已將它標記爲已回答。我被指向jsonlint.com,可以看到json是無效的,我只需要有效的json作爲輸入。 – Sam