欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 编程资源 > 编程问答 >内容正文

编程问答

newtonsoft.json 的序列化与反序列化 -凯发k8官方网

发布时间:2025/1/21 编程问答 11 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 newtonsoft.json 的序列化与反序列化 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

首先补充一点,json.net是支持序列化和反序列化datatable,dataset,entity framework和nhibernate的.我举例说明datatable的序列化和反序列化.
创建一个datatable对象,如下:

datatable dt = new datatable();datacolumn dcname = new datacolumn("name");datacolumn dcage = new datacolumn("age");datacolumn dccity = new datacolumn("city");dt.columns.add(dcname);dt.columns.add(dcage);dt.columns.add(dccity);for (int i = 0; i < 10; i ){datarow dr = dt.newrow();dr[0] = "name" i;dr[1] = "age" i;dr[2] = "city" i;dt.rows.add(dr);}

序列化:

string json = jsonconvert.serializeobject(dt);console.writeline(json);

结果:

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

datatable dt1 = jsonconvert.deserializeobject(json);for (int i = 0; i < dt1.rows.count; i ){datarow dr = dt1.rows[i];console.writeline("{0}\t{1}\t{2}\t", dr[0], dr[1], dr[2]);}

结果:

本节内容

1.空值的处理

2.默认值的处理

3.忽略某些属性

4.支持非公共成员

5.日期处理

预备知识:

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

var jsetting = new jsonserializersettings();string json = jsonconvert.serializeobject(obj,jsetting);

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

public class staff{public string name { get; set; }public int age { get; set; }public string gender { get; set; }public string departmentname { get; set; }public staff leader { get; set; }} 一.空值的处理

这里的空值指的是引用类型为null时,json.net如何处理.通过设置jsetting.nullvaluehandling的值来确定,该值为枚举类型.

nullvaluehandling.ignore 忽略为null的值
nullvaluehandling.include 默认值,包括为null的值

 

 

 

 

实例:

staff jack = new staff { name = "jack", age = 31, gender = "male", departmentname = "personnel department", leader = null };var jsetting = new jsonserializersettings();jsetting.nullvaluehandling = nullvaluehandling.ignore;string json = jsonconvert.serializeobject(jack,jsetting);console.writeline(json);

结果:

2.默认值的处理

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

defaultvaluehandling.ignore 序列化和反序列化时,忽略默认值
defaultvaluehandling.include 序列化和反序列化时,包含默认值

 

 

 

 

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

[defaultvalue(30)]public int age { get; set; }

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

staff jack = new staff { name = "jack", age = 30, gender = "male", departmentname = "personnel department", leader = null };var jsetting = new jsonserializersettings();jsetting.defaultvaluehandling = defaultvaluehandling.ignore;string json = jsonconvert.serializeobject(jack,jsetting);console.writeline(json);

结果:

3.忽略某些属性

首先介绍json.net序列化的模式:optout 和 optin.

optout默认值,类中所有公有成员会被序列化,如果不想被序列化,可以用特性jsonignore
optin默认情况下,所有的成员不会被序列化,类中的成员只有标有特性jsonproperty的才会被序列化,当类的成员很多,但客户端仅仅需要一部分数据时,很有用

 

 

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

[jsonobject(newtonsoft.json.memberserialization.optin)]public class staff{[jsonproperty]public string name { get; set; }public int age { get; set; }public string gender { get; set; }public string departmentname { get; set; }public staff leader { get; set; }}

序列化:

staff jack = new staff { name = "jack", age = 30, gender = "male", departmentname = "personnel department", leader = null };string json = jsonconvert.serializeobject(jack);

结果:

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

public class staff{public string name { get; set; }public int age { get; set; }public string gender { get; set; }public string departmentname { get; set; }[jsonignore]public staff leader { get; set; }}

序列化:

staff tom = new staff { name = "tome", age = 42, gender = "male", departmentname = "personnel department"}; staff jack = new staff { name = "jack", age = 30, gender = "male", departmentname = "personnel department", leader = tom }; string json = jsonconvert.serializeobject(jack); console.writeline(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如果你要序列化的日期格式是统一的,可以考虑如下方式

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

public class staff{public string name { get; set; }public int age { get; set; }public string gender { get; set; }public string departmentname { get; set; }public staff leader { get; set; }public datetime birthdate { get; set; }public datetime employmentdate { get; set; }}

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


staff jack = new staff { name = "jack", age = 30, gender = "male",departmentname = "personnel department", birthdate = new datetime(1982,2,12), employmentdate = new datetime(2010,12,12) };string json = jsonconvert.serializeobject(jack,new javascriptdatetimeconverter());console.writeline(json);

结果:

 

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

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

public class staff{public string name { get; set; }public int age { get; set; }public string gender { get; set; }public string departmentname { get; set; }public staff leader { get; set; }[jsonconverter(typeof(isodatetimeconverter))]public datetime birthdate { get; set; }[jsonconverter(typeof(javascriptdatetimeconverter))]public datetime employmentdate { get; set; }}

是的,通过特性"jsonconverter"来实现差异化的
序列化:

staff jack = new staff { name = "jack", age = 30, gender = "male",departmentname = "personnel department", birthdate = new datetime(1982,2,12), employmentdate = new datetime(2010,12,12) };string json = jsonconvert.serializeobject(jack);console.writeline(json);

结果:

5.2自定义日期格式

客户现在提出要求,希望得到的日期格式是符合中国人习惯的格式.要求返回的格式是"2012年4月20日".挑战来了,没有挑战就没有进步,我喜欢挑战.光说是没有用的!先分析一下怎么解决这个问题.我考虑了两种思路.
  思路一:
研究了一下上面两个日期处理类,发现他们都是继承了基类"datetimeconverterbase",所以我们可以参考"isodatetimeconverter"的实现方式,自己新建一个处理日期格式的转换器类.这种方式的缺点是可能要花大量的时间去研究,比较费时费力.优点就是可以对日期格式随心所欲的控制.
  思路二:
我又研究了一下"isodatetimeconverter",发现它的日期格式其实是由于内部defaultdatetimeformat = "yyyy'-'mm'-'dd't'hh':'mm':'ss.fffffffk"导致,而它也提供了修改日期样式的属性"datetimeformat",只要我们按照这种格式来写就ok了.

staff jack = new staff { name = "jack", age = 30, gender = "male",departmentname = "personnel department", birthdate = new datetime(1982,2,12), employmentdate = new datetime(2010,12,12) };isodatetimeconverter dtconverter = new isodatetimeconverter { datetimeformat = "yyyy'年'mm'月'dd'日'" };string json = jsonconvert.serializeobject(jack,dtconverter);console.writeline(json);

 结果:

转载于:https://www.cnblogs.com/08shiyan/p/3464028.html

总结

以上是凯发k8官方网为你收集整理的newtonsoft.json 的序列化与反序列化的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

网站地图