在JSON.NET数据解析期间忽略解析错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在JSON.NET数据解析期间忽略解析错误相关的知识,希望对你有一定的参考价值。
我有一个预定义数据结构的对象:
public class A
{
public string Id {get;set;}
public bool? Enabled {get;set;}
public int? Age {get;set;}
}
和JSON应该是
{ "Id": "123", "Enabled": true, "Age": 23 }
我想以积极的方式处理JSON错误,并且每当服务器返回已定义数据类型的意外值时,我希望它被忽略并且默认值被设置(null)。
现在,当JSON部分无效时,我收到JSON读卡器异常:
{ "Id": "123", "Enabled": "NotABoolValue", "Age": 23 }
而且我根本没有任何对象。我想要的是获得一个对象:
new A() { Id = "123", Enabled = null, Age = 23 }
并在可能的情况下解析警告。是否可以使用JSON.NET完成?
为了能够处理反序列化错误,请使用以下代码:
var a = JsonConvert.DeserializeObject<A>("-- JSON STRING --", new JsonSerializerSettings
{
Error = HandleDeserializationError
});
其中HandleDeserializationError
是以下方法:
public void HandleDeserializationError(object sender, ErrorEventArgs errorArgs)
{
var currentError = errorArgs.ErrorContext.Error.Message;
errorArgs.ErrorContext.Handled = true;
}
由于json字符串中存在错误,因此将多次调用HandleDeserializationError
。导致错误的属性不会被初始化。
与Ilijas解决方案相同,但是懒惰/匆忙的一个班轮(功劳归于他)
var settings = new JsonSerializerSettings { Error = (se, ev) => { ev.ErrorContext.Handled = true; } };
JsonConvert.DeserializeObject<YourType>(yourJsonStringVariable, settings);
Jam的道具让它更短=)
还有另一种方式。例如,如果您正在使用一个使用newton json的nuget包,并为您进行解除分类和seralization。如果包没有处理错误,您可能会遇到此问题。那么你不能使用上面的解决方案。你需要处理对象级别。这里变成OnErrorAttribute有用。因此,下面的代码将捕获任何属性的任何错误,您甚至可以在OnError函数中修改并分配默认值
public class PersonError
{
private List<string> _roles;
public string Name { get; set; }
public int Age { get; set; }
public List<string> Roles
{
get
{
if (_roles == null)
{
throw new Exception("Roles not loaded!");
}
return _roles;
}
set { _roles = value; }
}
public string Title { get; set; }
[OnError]
internal void OnError(StreamingContext context, ErrorContext errorContext)
{
errorContext.Handled = true;
}
}
见https://www.newtonsoft.com/json/help/html/SerializationErrorHandling.htm
以上是关于在JSON.NET数据解析期间忽略解析错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JSON.NET 使用十六进制编码字符解析格式错误的 JSONP?
无法解析片段中的 ViewModelProvider 构造?