天天看点

Newtonsoft.Json 的序列化与反序列化

首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.

创建一个DataTable对象,如下:

Newtonsoft.Json 的序列化与反序列化
Newtonsoft.Json 的序列化与反序列化

序列化:

结果:

利用上面得到的序列化字符串反序列化:

Newtonsoft.Json 的序列化与反序列化

本节内容

​​1.空值的处理​​

​​2.默认值的处理​​

​​3.忽略某些属性​​

​​4.支持非公共成员​​

​​5.日期处理​​

预备知识:

要想实现对Json.Net序列化和反序列化的控制,就要用到类JsonSerializerSettings,用法很简单实例化一个对象,并把它赋值给JsonConvert的参数即可.

开始之前,我还是先创建一员工类:

Newtonsoft.Json 的序列化与反序列化
Newtonsoft.Json 的序列化与反序列化

一.空值的处理

这里的空值指的是引用类型为NULL时,Json.Net如何处理.通过设置jSetting.NullValueHandling的值来确定,该值为枚举类型.

<col>

忽略为NULL的值

默认值,包括为NULL的值

实例:

Newtonsoft.Json 的序列化与反序列化

2.默认值的处理

 一般是对于值类型的处理,通过设置jSetting.DefaultValueHandling的值来确定,该值为枚举类型.

序列化和反序列化时,忽略默认值

序列化和反序列化时,包含默认值

给成员设置默任值,用到"DefaultValue(value)"特性,当然别忘了引入命名空间"System.ComponentModel",假设员工的年龄默认值为30

序列化时我想忽略为默认值的成员

Newtonsoft.Json 的序列化与反序列化

3.忽略某些属性

首先介绍Json.Net序列化的模式:OptOut 和 OptIn.

OptOut

默认值,类中所有公有成员会被序列化,如果不想被序列化,可以用特性JsonIgnore

OptIn

默认情况下,所有的成员不会被序列化,类中的成员只有标有特性JsonProperty的才会被序列化,当类的成员很多,但客户端仅仅需要一部分数据时,很有用

假如客户仅仅需要员工的姓名,此时

Newtonsoft.Json 的序列化与反序列化
Newtonsoft.Json 的序列化与反序列化

如果客户不想要员工的领导信息

Newtonsoft.Json 的序列化与反序列化
Newtonsoft.Json 的序列化与反序列化
Newtonsoft.Json 的序列化与反序列化

4.支持非公共成员

Json.Net序列化对象时,默认情况下仅仅序列化公有成员,如果想要非公有成员也被序列化,就要在该成员上加特性"JsonProperty"

5.日期处理

  JsonConverters会在序列化和反序列化时被用到。JsonConverters允许手动对Json的控制。当Json的结构很复杂和你想改变一个类型怎么样被序列化时,这是非常有用的。当一个JsonConverters被添加到JsonSerializer时,它会检查每一要被序列化和反序列化的值,并返回CanConvert,如果为True,则JsonConverter读和写这个值;需要注意的是,虽然JsonConverter能够使你可以完全的控制Json的值,但是很多的Json.Net序列化的特性被限制,像是类型名称和引用处理。所有的JsonConvert都在命名空间 "Newtonsoft.Json.Converters"下

5.1IsoDateTimeConverter 和 JavaScriptDateTimeConverter

这是Json.Net中自带的两个处理日期的类,默认是IsoDateTimeConverter ,它的格式是"yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK".另一个是JavaScriptTimeConverter,它的格式是 "new Date(ticks)",其实返回的是一个JavaScript的Date对象.

有两种方式来应用JsonConverter,改变Json序列化和反序列化的行为.

5.1.1如果你要序列化的日期格式是统一的,可以考虑如下方式

假设我们为员工添加两个日期类型的成员,出生日期和入职日期

Newtonsoft.Json 的序列化与反序列化
Newtonsoft.Json 的序列化与反序列化

我们的客户要求日期类型的成员返回javascript的日期对象

Newtonsoft.Json 的序列化与反序列化

5.1.2如果想要不同的日期类型成员序列化后,以不同的形式显示.

现在我们的客户要求出生日期以"ISO"标准日期格式返回,入职日期以Javascript的Date对象格式返回,修改我们的员工类

Newtonsoft.Json 的序列化与反序列化
Newtonsoft.Json 的序列化与反序列化

是的,通过特性"JsonConverter"来实现差异化的

Newtonsoft.Json 的序列化与反序列化

5.2自定义日期格式

客户现在提出要求,希望得到的日期格式是符合中国人习惯的格式.要求返回的格式是"2012年4月20日".挑战来了,没有挑战就没有进步,我喜欢挑战.光说是没有用的!先分析一下怎么解决这个问题.我考虑了两种思路.

  思路一:

研究了一下上面两个日期处理类,发现他们都是继承了基类"DateTimeConverterBase",所以我们可以参考"IsoDatetimeConverter"的实现方式,自己新建一个处理日期格式的转换器类.这种方式的缺点是可能要花大量的时间去研究,比较费时费力.优点就是可以对日期格式随心所欲的控制.

  思路二:

我又研究了一下"IsoDatetimeConverter",发现它的日期格式其实是由于内部DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"导致,而它也提供了修改日期样式的属性"DateTimeFormat",只要我们按照这种格式来写就OK了.

 结果:

Newtonsoft.Json 的序列化与反序列化

龙腾一族至尊龙骑