Json.net说法——(四)序列化错误处理
序列化错误处理
json.net支持序列化和反序列化错误处理。错误处理可以捕捉错误并且可以选择处理错误且继续序列化或把从程序中错误抛出。
定义错误处理有两种方法:错误事件和错误修饰标签。
(一)事件处理
List<string> errors = new List<string>();
List<DateTime> c = JsonConvert.DeserializeObject<List<DateTime>>(@"[
""2009-09-09T00:00:00Z"",
""不能转换为日期"",
[
1
],
""1977-02-20T00:00:00Z"",
null,
""2000-12-01T00:00:00Z""
]",
new JsonSerializerSettings
{
Error =delegate(object obj,Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
},
Converters ={new IsoDateTimeConverter()}
});
foreach (DateTime dd in c)
{
Console.WriteLine(dd.ToString());
}
泛型列表c是一个日期类型的集合,其中有3个值不能成功序列化。如果不添加错误事件处理,则序列化出现错误。但通过错误事件处理,捕捉了其中的异常并使序列化继续下去。
输出结果:
/*
2009-9-9 0:00:00
1977-2-20 0:00:00
2000-12-1 0:00:00
*/
new JsonSerializerSettings
{
Error =delegate(object obj,Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
},
Converters ={new IsoDateTimeConverter()}
});
在系列化设置中,添加错误事件处理:
·Error属性是一个泛型委托:
EventHandler<Newtonsoft.Json.Serialization.ErrorEventArgs> fun =
delegate(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
};
这个例子中把一个json反序列化为一个日期集合。在序列化设置过程中为错误事件分配一个处理器,这个处理器用于记录错误信息并且标记这些错误是经过处理的。
这个json反序列化的结果是:有3个反序列化的日期对象和3个错误信息,
·该字符串未被识别为有效的 DateTime。有一个从索引 0 处开始的未知字。
·Unexpected token parsing date. Expected String, got StartArray.
·Cannot convert null value to System.DateTime.
(二)属性标签
json.net支持的这种属性标签很像其它.net序列化标签。只要用它来修饰方法并设置正确的参数即可。它的修饰的方法的参数有:StreamingContext和ErrorContext。而方法名无关。
public class PersonError
{
List<string> _list;
public string Name { get; set; }
public int Age { get; set; }
public List<string> HorseList
{
get
{
if (_list == null)
throw new Exception("Roles not loaded!");
return _list;
}
set { _list = value; }
}
public string Memo { get; set; }
[OnError]
internal void OnError(StreamingContext context, ErrorContext errorContext)
{
errorContext.Handled = true;
}
}
PersonError person = new PersonError
{
Name = "宋江",
Age = 32,
HorseList =null,
Memo = "天魁星"
};
string json = JsonConvert.SerializeObject(person, Formatting.Indented);
Console.WriteLine(json);
在这个例子中,访问HorseList属性时如果没有元素则会抛出异常。被属性标签修饰的方法会在序列化HorseList时处理错误并使序列化继续序列化类。
结果:
/*
{
"Name": "宋江",
"Age": 32,
"Memo": "天魁星"
}
*/
转载于:https://www.cnblogs.com/jams742003/archive/2009/12/25/1632080.html
Json.net说法——(四)序列化错误处理相关推荐
- go json数据出现unicode_Golang处理JSON(一) 序列化
前言 JSON 是目前最为流行的序列化手段,Go语言对于这些标准格式的编码和解码都有良好的支持,在Go语言中,encoding/json标准包处理json数据的序列化与反序列化问题.下面主要讲解序列化 ...
- spark出现task不能序列化错误的解决方法 org.apache.spark.SparkException: Task not serializable...
import org.elasticsearch.cluster.routing.Murmur3HashFunction; import org.elasticsearch.common.math.M ...
- JSON与js对象序列化
JavaScript对象表示法(JavaScript Object Notation,简称JSON)是一种轻量级的数据交换格式,它基于js字面量表示法,是js的一个子集.虽然是一个js的子集但是他与语 ...
- 音频开发中常见的四个错误
以下内容主要为音频开发人员所编写,但同样也能为其他领域并与此相关的开发者带来帮助.在下文当中我将介绍针对开发人员的诊断工具,并分享常见的四个错误以及如何检测问题是否存在并做得更好. 文 / Micha ...
- 将MSRA-TD500标签转换成逆时针输出标签+labeleme json格式转四个点的txt
一.MSRA-TD500 : http://www.iapr-tc11.org/mediawiki/index.php/MSRA_Text_Detection_500_Database_%28MSRA ...
- Android日志[进阶篇]四-获取错误报告
Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Androi ...
- 递归序列化错误:Recursive Serialization is not supported. You can‘t dereference a PPtr while loading.
递归!序列化!错误!这个bug不简单,看着就感觉很牛皮. 报错信息:Recursive Serialization is not supported. You can't dereference a ...
- python的说法中错误的是_【单选题】下列关于python的说法中,错误的是( )。...
[单选题]下列关于python的说法中,错误的是( ). 更多相关问题 [问答题,简答题] 著作法制定的目的是什么? [单选] 查找华东政法大学刘宪权教授的论文,简单的逻辑提问式() [单选] 如果机 ...
- 自定义一个类型实现go时间类型的json和bson的序列化和反序列化
自定义一个类型实现go时间类型的json和bson的序列化和反序列化 需求 实现 -自定义JSONTime类型 如何使用? 需求 go语言在时间 和 json 转换时使用 yyyy-MM-dd HH: ...
最新文章
- java 学习代码库_java 学习4
- aqs java 简书,Java AQS源码解读
- MySQL 导出命令
- [HNOI2016]网络 树链剖分,堆
- ‘ascii‘ codec can‘t encode characters in position
- MySQL数据分析-(1) 数据库前言
- pythontk界面显示函数中的变量值_简单易学,西门子触摸屏3种修改变量值的方法!博图Wincc V14组态...
- linux系统支持什么格式的软件吗,UOS系统支持什么样的软件包格式:其实Deb,Rpm,Tar.gz源码包都行...
- HTTP1.1之后的长连接和WebSocket的长连接之间的区别
- Go语言:数组练习—从一个整数数组中获取最大整数,最小整数,总数以及平均值
- 推荐C语言编译器(手机APP)
- 急需小米笔记本TM1709最新版BIOS Firmware,当前是版:RMRKB5R0P0504 日期:2018/09/04 多谢帮助!
- 替换word模板内容 Java实现
- 电脑wifi 找不到网络怎么办
- 【GPL和LGPL】【VPlayer不开源】【其他开源的基本都仅是ffmpeg修改部分】
- kali 清理系统垃圾文件
- MySQL服务器配置优化(读书笔记)
- 基于rancheros离线安装Habor以及Rancher
- js笔试面试题(随意)
- vue屏幕分辨率适配实战解析
热门文章
- Java是块级作用域吗_javascirpt如何模仿块级作用域(js高程笔记)
- KNN(二)--近似最近邻算法ANN
- php抽象类继承抽象类,PHP抽象类和抽象方法以及接口
- 卷积云神经网络_有卷积云的北京天空好美!是不是还有池化云?全连接云?
- python字典forward_《Python机器学习基础教程》
- Markdown(五)——绘图工具mermaid之流程图Flowchart
- 内固定取出术后护理_骨折术后康复治疗全知道!
- mysql explain select_type
- Hbase table CRUD操作及scala编程
- Zephyr调整Main栈大小