Newtonsoft.Json/Json.NET忽略序列化时的意外错误
|
在.NET中Newtonsoft.Json(Json.NET)是我们常用来进行Json序列化与反序列化的库。
而在使用中常会遇到反序列化Json时,遇到不规则的Json数据解构而抛出异常。
Newtonsoft.Json 支持序列化和反序列化过程中的错误处理。
允许您捕获错误并选择是处理它并继续序列化,还是让错误冒泡并抛出到您的应用程序中。
错误处理是通过两种方法定义的: JsonSerializerSettings 上的ErrorEvent和OnErrorAttribute。
ErrorEvent
下面是个ErrorEvent的例子,下面的例子中我们既能正确反序列化列表中的事件类型,也能捕获其中的错误事件- 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, ErrorEventArgs args)
- {
- errors.Add(args.ErrorContext.Error.Message);
- args.ErrorContext.Handled = true;
- },
- Converters = { new IsoDateTimeConverter() }
- });
- // 2009-09-09T00:00:00Z
- // 1977-02-20T00:00:00Z
- // 2000-12-01T00:00:00Z
复制代码 OnErrorAttribute
OnErrorAttribute的工作方式与 Newtonsoft.Json 的其他.NET 序列化属性非常相似。
您只需将该属性放置在采用正确参数的方法上:StreamingContext 和 ErrorContext。方法的名称并不重要。- 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;
- }
- }
- PersonError person = new PersonError
- {
- Name = "George Michael Bluth",
- Age = 16,
- Roles = null,
- Title = "Mister Manager"
- };
- string json = JsonConvert.SerializeObject(person, Formatting.Indented);
- Console.WriteLine(json);
- //{
- // "Name": "George Michael Bluth",
- // "Age": 16,
- // "Title": "Mister Manager"
- //}
复制代码
来源:https://www.cnblogs.com/chenyishi/p/18085582
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|
|
|
发表于 2024-3-21 13:45:48
举报
回复
分享
|
|
|
|