JSON 序列化的时候忽略无效的属性值

摘要:
Age{get;set;}}当我为TestValue属性传入一个非法数据的时候,在使用JSON.NET进行反序列化时会抛出异常。例如我通过以下代码对一个字符串进行反序列化,如果不出意外的话会提示无效参数值的异常。varsettings=newJsonSerializerSettings{Error==˃{args2.ErrorContext.Handled=true;}};varnewValue=JsonConvert.DeserializeObject;这样,在进行反序列化的时候就可以忽略TestValue的无效值,为其属性设置为null,并且成功解析Age的值。如果你是ASP.NETCore的程序,可以通过IServiceCollection的Configure()方法来配置Error的处理器。

例如我拥有以下代码。

public class NewObject
{
    public int? TestValue { get; set; }

    public int? Age { get; set; }
}

当我为 TestValue 属性传入一个非法数据的时候,在使用 JSON.NET 进行反序列化时会抛出异常。例如我通过以下代码对一个字符串进行反序列化,如果不出意外的话会提示无效参数值的异常。

var newValue = JsonConvert.DeserializeObject<NewObject>(@"{""TestValue"":""FFFF"",""Age"":15}",settings);

通过 Stackoverflow 查询得知,可以通过在反序列化时指定 JsonSerializerSettings 对象进行忽略。

var settings = new JsonSerializerSettings
{
	Error = (obj, args2) =>
	{
		args2.ErrorContext.Handled = true;
	}
};

var newValue = JsonConvert.DeserializeObject<NewObject>(@"{""TestValue"":""FFFF"",""Age"":15}",settings);

这样,在进行反序列化的时候就可以忽略 TestValue 的无效值,为其属性设置为 null,并且成功解析 Age 的值。

如果你是 ASP.NET Core 的程序,可以通过 IServiceCollectionConfigure<T>() 方法来配置 Error 的处理器。

services.Configure<MvcJsonOptions>(jsonOptions =>
{
	// 忽略转换过程中的异常信息
	jsonOptions.SerializerSettings.Error += (sender, args) => { args.ErrorContext.Handled = true; };
});

免责声明:文章转载自《JSON 序列化的时候忽略无效的属性值》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇android 桌面文件平夹Shell 判断下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# 序列化与反序列化之DataContract与xml对子类进行序列化的解决方案

C# 序列化与反序列化之DataContract与xml对子类进行序列化的解决方案 1、DataContract继承对子类进行序列化的解决方案 第一种是在 [DataContract, KnownType(typeof(继承的子类))]添加 KnownType(typeof(继承的子类))即可,第二种是在序列化的时候,添加类型 DataContractSe...

Android间的进程通讯(传递复杂对象)

Android间的进程通讯(传递复杂对象) 完成对复杂对象的序列化 在Android中传递复杂数据类型的时候要通过将序列化,在Android中提供了一个接口Parcelable来实现对对象的序列化。 下面对需要传输的对象进行序列化操作,首先看自定义的类Person。 packagecom.example.service_parcelable_conmmut...

java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)

切面打印日志时,参数序列化异常异常信息:java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)原因jo...

Xml序列化去掉命名空间,去掉申明

#region 序列化        /// <summary>        /// 序列化        /// </summary>        /// <param name="type">类型</param>        /// <param name="obj">对象</pa...

第6章 RPC之道

 6.1 认识RPC 分布式、微服务的架构思维中都不能缺少 RPC 的影子 RPC(Remote Procedure Call)远程过程调用。通过网络在跨进程的两台服务器之间传输信息,我们使用的时候不用关心网络底层的实现,通过RPC调用远程服务就像本地调用系统内部方法一样方便。 在 OSI 网络通信模型中,RPC跨越了传输层和应用层,使开发分布式应用程序变...

c# 序列化效率比拼

前言:作为开发人员,对象的序列化经常用到,特别是在现在前后端分离 采用json 交互 ,就将原来用过的几种方式总结了下,也算是做一个记录,顺便做了下性能测试。 1:内置 JavaScriptSerializer 2:常用  Newtonsoft.Json.dll 3:第3方 Jil  https://github.com/kevin-montrose/Ji...