首页 > 其他分享 >Newtonsoft.Json/Json.NET忽略序列化时的意外错误

Newtonsoft.Json/Json.NET忽略序列化时的意外错误

时间:2024-03-21 10:00:23浏览次数:25  
标签:00 Newtonsoft Json new 00Z 序列化

在.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 one rror(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"
//}

 

标签:00,Newtonsoft,Json,new,00Z,序列化
From: https://www.cnblogs.com/chenyishi/p/18085582

相关文章

  • JWT(JSON WEB TOKEN)是玩具吗
    JWT当然不是玩具,理解其设计意图,和适用场景自然会发现存在的就是有价值的JWT:JSONWebToken起源和定义JWT(JSONWebToken)是由IETF(InternetEngineeringTaskForce)基于RFC7519规范定义的。它是一种用于在网络应用间传递信息的标准方法。JWT最初由无状态的分布式应用场......
  • URLDNS反序列化利用
    这是java的原生利用链,通常用于反序列化的验证,因为是原生态不存在版本限制HashMap结合URL触发的DNS检查思路利用链HashMap-->readObject()HashMap-->hash()URL-->hashcode()URL-->getByName()进行域名解析的函数利用分析首先新建一个DnsTester类,new一个Hash......
  • Android视角看鸿蒙第七课(module.json5中的各字段含义之abilities)
    Android视角看鸿蒙第七课(module.json5中的各字段含义之abilities)导读今天一起来了解module.json5中的最后一个字段,也是最复杂的字段abilities官方文档Indicatesallabilitiesinthecurrentmodule.Thevalueisanarrayofobjects,eachofwhichrepresentsan......
  • fastjson记录
    参考指南fastjson:我一路向北,离开有你的季节|素十八(su18.org)Java反序列化漏洞始末(3)—fastjson-浅蓝'sblog(b1ue.cn)梅子酒の笔记本(meizjm3i.github.io)fastjson基础早期版本的fastjson的框架图fastjson功能要点:fastjson在创建一个类实例时会通过反射......
  • C# 中使对象序列化/反序列化 Json 支持使用派生类型以及泛型的方式
    C#中使对象序列化/反序列化Json支持使用派生类型以及泛型方式废话#前言#为啥想写这个博客最近自己写的框架有用到这个类似工作流,支持节点编码自定义,动态运行自定义.尽量减少动态解析这就需要确定类型.有什么好的奇思妙想可以一起来讨论噢(现在还是毛坯,测......
  • package-lock.json
    生成package-lock.json文件:1、运行npminstall命令,npm将自动生成package-lock.json文件。2、如果你已经安装了依赖,但是没有生成package-lock.json文件:运行npminstall--save命令,这将会更新package-lock.json文件,并确保所有依赖项都被正确记录。3、如果你想要使用package-lock......
  • JSON Web Token 入门教程
    本文收录于Github.com/niumoo/JavaNotes,Java系列文档,数据结构与算法!本文收录于网站:https://www.wdbyte.com/,我的公众号:程序猿阿朗JSONWebToken(JWT)是一种可以在多方之间安全共享数据的开放标准,JWT数据经过编码和数字签名生成,可以确保其真实性,也因此JWT通常用于身份认证......
  • 2024中国行政区域含港澳台【省市区县镇乡村】五级联动地址json数据
    GitHub-657258535/China-Area-Region-Administrative-Divisions:中华人民共和国行政区划:省级(省份)、地级(城市)、县级(区县)、乡级(乡镇街道)、村级(村委会居委会)五级联动地址数据。 中华人民共和国行政区划:省级(省份)、地级(城市)、县级(区县)、乡级(乡镇街道)、村级(村委会居委会)......
  • 资源加载和序列化
    一切加载最后都要跑到LoadPackageInternal:创建Linker序列化(LoadAllObjects){ FUObjectSerializeContext*InOutLoadContext=LoadContext; Linker=GetPackageLinker(InOuter,PackagePath,LoadFlags,nullptr,InReaderOverride,&InOutLoadContext,ImportLinker,In......
  • JavaScript学习笔记7: 对象 - 自定义对象&JSON
    JS对象-自定义对象&JSON自定义对象类似java的类Json的所有属性(key)需要用双引号包围,本质是字符串<script>    varuser={    name:"tom",    age:10,    gender:"male",    //eat:function(){}    //可以简写为    eat(){//自......