zoukankan      html  css  js  c++  java
  • 2019-8-31-dotnet-手动解决-json-解析中不合法字符串

    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 的方法

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

    @"[
          '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

  • 相关阅读:
    强连通 HDU 1827
    强联通 HDU 2767 3836
    强连通 HDU 1269
    网络流 poj 2135
    强联通 poj 2762
    android20-[【转】Android的EditText自动获取焦点并弹出输入法问题]
    windows开发中的一点总结
    android19
    android18
    android17
  • 原文地址:https://www.cnblogs.com/lindexi/p/12085765.html
Copyright © 2011-2022 走看看