我已花了大约一天的时间。如果我有一个像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