title author date CreateTime categories
dotnet 手动解决 json 解析中不合法字符串
lindexi
2019-08-31 16:55:58 +0800
2019-3-20 8:59:1 +0800
dotnet

如果使用 Newtonsoft Json 解析字符串,字符串里面有不清真的格式,那么默认的解析将会炸掉。如果想要自己解决字符串中的不清真格式,可以使用传入 JsonSerializerSettings 的方法

我写了一段字符串,里面需要解析为日期请看代码

  1. @"[
  2. '2009-09-09T00:00:00Z',
  3. '这是歪楼的',
  4. [
  5. 1
  6. ],
  7. '1977-02-20T00:00:00Z',
  8. null,
  9. '2000-12-01T00:00:00Z'
  10. ]"

小伙伴很快就可以看到,这里有一个歪楼的字符串

如果直接解析,那么将会炸掉

  1. List<DateTime> list = JsonConvert.DeserializeObject<List<DateTime>>(@"[
  2. '2009-09-09T00:00:00Z',
  3. '这是歪楼的',
  4. [
  5. 1
  6. ],
  7. '1977-02-20T00:00:00Z',
  8. null,
  9. '2000-12-01T00:00:00Z'
  10. ]");

运行上面代码,可以看到一个有趣的代码

自己解决不合法的字符串可以通过 JsonSerializerSettings 的方法,里面有一个委托,在发现有不清真的字符串的时候就会调用这个委托

  1. List<string> errors = new List<string>();
  2.  
  3. new JsonSerializerSettings
  4. {
  5. Error = (sender, e) =>
  6. {
  7. errors.Add(e.ErrorContext.Error.Message);
  8. e.ErrorContext.Handled = true;
  9. },
  10. Converters = { new IsoDateTimeConverter() }
  11. }

其实这里的 DeserializeObject 可以传入两个参数,一个是字符串,一个是 JsonSerializerSettings 所以就可以做到在发现不清真的字符串的时候调用委托,同时支持传入从字符串转类的方法

  1. List<string> errors = new List<string>();
  2.  
  3. List<DateTime> list = JsonConvert.DeserializeObject<List<DateTime>>(@"[
  4. '2009-09-09T00:00:00Z',
  5. '这是歪楼的',
  6. [
  7. 1
  8. ],
  9. '1977-02-20T00:00:00Z',
  10. null,
  11. '2000-12-01T00:00:00Z'
  12. ]",
  13. new JsonSerializerSettings
  14. {
  15. Error = (sender, e) =>
  16. {
  17. errors.Add(e.ErrorContext.Error.Message);
  18. e.ErrorContext.Handled = true;
  19. },
  20. Converters = { new IsoDateTimeConverter() }
  21. });

这时运行代码不会炸掉,因为设置了 e.ErrorContext.Handled 是 true 如果想要记录问题同时需要炸掉,那么就不要写这个代码

所有代码请看 github

Serialization Error Handling

2019-8-31-dotnet-手动解决-json-解析中不合法字符串的更多相关文章

  1. dotnet 手动解决 json 解析中不合法字符串

    如果使用 Newtonsoft Json 解析字符串,字符串里面有不清真的格式,那么默认的解析将会炸掉.如果想要自己解决字符串中的不清真格式,可以使用传入 JsonSerializerSettings ...

  2. iOS解决json串中的NSNull类型

    iOS解决json串中的NSNull类型   后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符 ...

  3. JSON 解析中遇到的坑😭

    最近做加解密遇到一个很“奇葩的问题”,解析服务端加密后的字符串 序列化 时一直报错 "json解析失败:Error Domain=NSCocoaErrorDomain Code=3840 & ...

  4. 关于json解析中 解析多重json对象

    JSONObject rst = {"AIS-RST":"AIS-00000001","AIS-STATUS":"AIS-0000 ...

  5. iOS开发解决json串中的NSNull类型

    后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符串.下面是转化方法: 1 自定义的几个方法:放 ...

  6. iOS json解析中包含“\n”等解析出错

    文题算是解决了,把特殊字符替换一下:-(NSString *)JSONString:(NSString *)aString {    NSMutableString *s = [NSMutableSt ...

  7. 如何手动实现C语言中的字符串操作

    学了字符串操作,很多人也许学了大概知道怎么用,但是太久没用就忘了,恰恰这是找软件工程师或者嵌入式工程师以及C,C++相关的笔试面试必考的题目!接下来我们来看看如何手动实现这些相关的函数. 废话不多说, ...

  8. Flutter网络请求与JSON解析

    本文介绍如何在Flutter中创建HTTP网络请求和对请求的json string进行类型解析. 网络请求 官方使用的是用dart io中的HttpClient发起的请求,但HttpClient本身功 ...

  9. 简单快速的让你的json解析速度快上加快

    背景 最近小编在做公司的一个需求.要求是把系统内的一些大型文本文件上传到第三方那里,而且第三方要求的交互数据的方式是采用post请求发送json串的形式进行的. 问题 做到中途才发现问题,由于单个文本 ...

随机推荐

  1. node---处理get请求

    const http=require('http') const querystring=require('querystring') const server = http.createServer ...

  2. TCP三次握手形象理解

    tcp三次握手就像是你用企业微信给人家发信息,首先你得确认别人在不在,你会发  在吗?  这个时候显示的是未读   对方看到之后未读会变成已读 然后他会回复你  在的    你看到这个消息后,他那边也 ...

  3. 树莓派3b+ 实现视频监控

    设备:树莓派3B+.Raspberry Pi Camera sudo raspi-config #启动camera sudo reboot #监测摄像头是否安装成功 raspistill -o ima ...

  4. 【BZOJ2298】【luoguP2519】problem a

    description 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同的分数) analysis 这题转化模 ...

  5. thinkphp 控制器定义

    控制器和操作 一般来说,ThinkPHP的控制器是一个类,而操作则是控制器类的一个公共方法. 下面就是一个典型的控制器类的定义: <?php namespace Home\Controller; ...

  6. SPSS分析:Bootstrap

    SPSS分析:Bootstrap 一.原理: 非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法,也称为自助法.其核心思想和基本步骤如下: 1.采用重抽样技术从原始样本中抽取一定数量(自己 ...

  7. tomcat JAVA_OPTS设置

    原文地址:https://blog.csdn.net/bamboo_cqh/article/details/72820700 AVA_OPTS ,顾名思义,是用来设置JVM相关运行参数的变量. JVM ...

  8. ps快速将白底图片变为透明图片

    方法一: 如果图层有锁图标,则要点击它,然它消失.然后选中魔棒工具,然后点击图片上要透明的区域,按下backspace键即可. 方法二: 转载自:https://blog.csdn.net/sunyi ...

  9. day 82 Vue学习三之vue组件

      Vue学习三之vue组件   本节目录 一 什么是组件 二 v-model双向数据绑定 三 组件基础 四 父子组件传值 五 平行组件传值 六 xxx 七 xxx 八 xxx 一 什么是组件 首先给 ...

  10. File、FileFilter、递归初步

    java.io.File 文件和目录 路径名的抽象表示形式 文件:File 存储数据的 目录:Directory 文件夹 用来存储文件 路径:Path 定位具有平台无关性 在任意平台都可以使用 Fil ...