专栏首页林德熙的博客dotnet 手动解决 json 解析中不合法字符串

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

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

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

@"[
      '2009-09-09T00:00:00Z',
      '这是歪楼的',
      [
        1
      ],
      '1977-02-20T00:00:00Z',
      null,
      '2000-12-01T00:00:00Z'
    ]"

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

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

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

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

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

             List<string> errors = new List<string>();

               new JsonSerializerSettings
                {
                    Error = (sender, e) =>
                    {
                        errors.Add(e.ErrorContext.Error.Message);
                        e.ErrorContext.Handled = true;
                    },
                    Converters = { new IsoDateTimeConverter() }
                }

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

           List<string> errors = new List<string>();

            List<DateTime> list = JsonConvert.DeserializeObject<List<DateTime>>(@"[
      '2009-09-09T00:00:00Z',
      '这是歪楼的',
      [
        1
      ],
      '1977-02-20T00:00:00Z',
      null,
      '2000-12-01T00:00:00Z'
    ]",
                new JsonSerializerSettings
                {
                    Error = (sender, e) =>
                    {
                        errors.Add(e.ErrorContext.Error.Message);
                        e.ErrorContext.Handled = true;
                    },
                    Converters = { new IsoDateTimeConverter() }
                });

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

所有代码请看 github

Serialization Error Handling


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C# 16 进制字符串转 int

    最近在写硬件,发现有一些测试是做 16 进制的字符串,需要把他转换为整形才可以处理。 本文告诉大家如何从 16 进制转整形。

    林德熙
  • PowerShell 通过 WMI 获取补丁

    Win32_QuickFixEngineering class - Windows applications

    林德熙
  • win10 uwp 客户端如何发送类到 asp dotnet core 作为参数

    本文告诉大家如何在 UWP 或 WPF 客户端通过将类转换为 json 发送到 asp dotnet core 作为方法的参数

    林德熙
  • The Things Network LoRaWAN Stack V3 学习笔记 3.1.2.3_1 从 ChMask 问题引申出一个 golang 循环语句易错问题

    在测试 LinkADR 功能时,发现了 STACK 中一个 ChMask 的问题,经过好几天的摸索,终于搞定了问题。根源是 range 语句中的内存分配问题,本...

    twowinter
  • 【DB笔试面试614】在Oracle中,和视图相关的查询转换有哪些?

    小麦苗DBA宝典
  • AkShare-宏观经济-中国LPR数据

    LPR数据对大家都有非常重大的影响,尤其是有房贷的各位小伙伴,特提供 LPR 数据接口,欢迎大家使用。

    AkShare
  • [Matlab]使用Simulink进行UDP通讯2

    原文链接:http://blog.csdn.net/humanking7/article/details/50710108

    祥知道
  • 手搓一个分布式大气监测系统(三)使用 Nucleo LoRa 开发套件打造 PM2.5 监测终端

    鹅民大气监测项目前期已搭建了5个种子监测点,接下去将吸引更多的志愿者来搭建终端,接入系统,一起搭建监测网络。从二期开始,大气监测项目组的同事优选了几款开发套件完...

    twowinter
  • payload

    用户2657851
  • 新建、删除文件夹需要强制刷新的问题

    用户2657851

扫码关注云+社区

领取腾讯云代金券