Json.Net系列教程 3.Json.Net序列化和反序列化设置

上节补充

首先补充一点,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<DataTable>(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.日期处理

6.FAQ

预备知识:

要想实现对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);

 结果:

6.FAQ
1.如何自定义序列化的字段名称?
默认情况下,Json.Net序列化后结果中的字段名称和类中属性的名称一致.如果想自定义序列化后的字段名称,可以使用JsonProperty.例如:
 public class Person{public int Id { get; set; }public string Name { get; set; }}

默认序列化的结果为: {"Id":1,"Name":"杨过"},如果不想用默认的字段名称,可以使用如下方式:

public class Person
{[JsonProperty(PropertyName = "PersonId")]public int Id { get; set; }[JsonProperty(PropertyName = "PersonName")]public string Name { get; set; }
}

这样序列化的结果为:{"PersonId":1,"PersonName":"杨过"}

转载于:https://www.cnblogs.com/usharei/archive/2012/04/20/2458858.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5道谷歌面试题:即使是天才也要怀疑自己能力了(附答案)

全世界只有3.14 % 的人关注了数据与算法之美谷歌&#xff0c;美国的跨国科技企业&#xff0c;致力于互联网搜索、云计算、广告技术等领域&#xff0c;开发并提供大量基于互联网的产品与服务。这样一家实力雄厚前景无量的公司是众多求职者梦寐以求的地方&#xff0c;然而&#x…

红玫瑰数java的意思,红玫瑰的含义,玫瑰花个数的含义

导航&#xff1a;网站首页 >红玫瑰的含义,玫瑰花个数的含义时间&#xff1a;2018-2-27相关问题:匿名网友:1朵玫瑰代表——我的心中只有你ONLY YOU&#xff01;2朵玫瑰代表——这世界只有我俩&#xff01;3朵玫瑰代表——我爱你I LOVE YOU&#xff01;4朵玫瑰代表——至死不渝…

(装载)C#中AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath的区别

// 获取程序的基目录。System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径。System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName // 获取和设置当前目录(该进程从中启动的目录)的完全限定目录。System.Environment.CurrentDirectory // 获…

[Abp vNext 源码分析] - 18. 单元测试

简介ABP vNext 框架使用 xUnit 作为单元测试组件&#xff0c;官方的所有模块都编写了大量的 单元/集成测试 确保功能正常。由于 ABP vNext 模块化系统的原因&#xff0c;开发人员在建立单元测试项目的时候需要集成 Volo.Abp.UnitTest 项目&#xff0c;这样在执行单元测试的时候…

php表格单元格怎么实现排序,javascript实现对表格元素进行排序操作

我们在上网中都能看到很多能够排序的&#xff0c;如大小、时间、价格等现在我们也试一下排序功能&#xff1a;排序的函数代码&#xff1a;里面含有点击之后排序--还原&#xff0c;和排升序和降序。function sortAge(){//对年龄进行排序&#xff0c;要先进行获得每一行对象&…

【10.29周一电商,已好】中国日历的至高境界,377张震撼级插画,美到爆!

每段时光都有属于每段时光的回忆它们是童年的纸飞机是校园时代的试卷与课本是第一次离开家乡时的兴奋与忐忑是跟某个人眼神交汇时的慌乱...回忆如此珍贵&#xff0c;以致于令我们频频回想&#xff0c;渴望着回到过去&#xff0c;与美好再度相逢。还记得文先生给大家推荐过的新一…

设置润乾报表鼠标移到格子上就显示提示内容

为了达到一定的交互性和易用性,我们一般喜欢将鼠标移动到格子上就能显示出一定的提示信息,比方说这个格子大小固定了但是里面内容超出格子了,这样我们希望鼠标移动过去后能自动提示所有的内容。用润乾报表可以这样设计&#xff1a; 比方说一个格子里面有如下内容 “这是一个很长…

ASP.NET Core 单元测试:如何Mock Url.Page()

点击上方蓝字关注“汪宇杰博客”导语在 ASP.NET Core 中&#xff0c;当你在 UrlHelperExtensions 类上使用扩展方法时&#xff0c;很难在单元测试中编写Mock。因为Moq框架不支持模拟扩展方法。问题例如&#xff0c;我的博客代码中使用了 Url.Page() 方法&#xff1a;var callba…

matlab dwt函数应用,MATLAB中关于DCT,DFT和DWT的相关函数

1. 离散傅立叶变换的 Matlab 实现Matlab 函数 fft、fft2 和 fftn 分别可以实现一维、二维和 N 维 DFT 算法&#xff1b;而函数 ifft、ifft2 和ifftn 则用来计算反 DFT 。这些函数的调用格式如下&#xff1a;A&#xff1d;fft(X,N,DIM)其中&#xff0c;X 表示输入图像&#xff1…

“甜橙金融杯”数据建模大赛发布,8万重金寻找大数据金融人才!

全世界有3.14 % 的人已经关注了数据与算法之美随着互联网概念不断发展&#xff0c;越来越多的商家进入这一市场。为了在竞争中拉取新用户&#xff0c;培养用户的消费习惯&#xff0c;各种类型的营销和补贴活动层出不穷。为正常用户带来福利的同时&#xff0c;也催生了一批“羊毛…

常用加解密工具集合|视频图片加解密方案

最近工作需要做视频加密解密&#xff0c;大概需求就是摄像头录制好的视频实时加密存储到本地&#xff0c;防止别人拔掉存储卡把视频拷贝走。大胆设想一下&#xff0c;假如现在很多网约车车内都有摄像头&#xff0c;这些对着乘客和司机的车内摄像头都是实时录制视频并存储到本地…

修炼九阴真经Windows Phone开发 (7):本地化应用程序栏Localizing an Application Bar 下...

本节介绍另一个本地化的方法&#xff1a; 在项目中添加资源文件&#xff1a;&#xff08;这个文件将包含应用程序的默认语言的资源&#xff09; 将要名称和值添加进去。&#xff08;作为应用程序中向用户显示字符串值&#xff09;. 重复上面的方法&#xff0c;向项目中添加更多…

matlab编程数字信号,MATLAB--数字信号实验.doc

MATLAB--数字信号实验前言MATLAB 是一套功能强大的工程计算及数据处理软件&#xff0c;广泛应用于工业&#xff0c;电子&#xff0c;医疗和建筑等众多领域。它是一种面向对象的&#xff0c;交互式程序设计语言&#xff0c;其结构完整又优良的可移植性。它在矩阵运算&#xff0c…

统治世界的十大算法

全世界有3.14 % 的人已经关注了数据与算法之美软件正在统治世界。而软件的核心则是算法。算法千千万万&#xff0c;又有哪些算法属于“皇冠上的珍珠”呢&#xff1f;Marcos Otero 给出了他的看法。什么是算法&#xff1f;通俗而言&#xff0c;算法是一个定义明确的计算过程&…

Hosting in .NET Core

在.NET Core中&#xff0c;Host负责应用程序的启动和生命周期管理。除此之外&#xff0c;在Host中还可以设置日志(Logging)、配置(Configuration)和依赖关系注入(Dependency Injection)等。Host将一个常规的控制台应用程序(Console Application)变成了一个可以长时间运行的服务…

hilbert曲线序编码matlab,Hilbert曲线扫描矩阵的生成算法及其MATLAB程序代码

Hilbert曲线扫描矩阵的生成算法及其MATLAB程序代码王笋,徐小双(华中科技大学控制科学与工程系&#xff0c;武汉 430074)摘 要Hilbert曲线是一种重要的图像处理工具,在图像处理,特别是图像扫描中广泛应用.为了正确快速的生成Hilbert曲线扫描矩阵,提出了基于矩阵运算的生成Hilber…

java例程练习(一维数组)

public class Test {public static void main(String[] args) {int a[] { 3, 9, 8}; //静态初始化Date days1 [] {new Date(1, 4, 2004),new Date(2, 4, 2004),new Date(3, 4, 2004)};//动态初始化Date [] days2 new Date[3];for (int i 0; i < 3; i) {days2[i] new Da…

如何用大数据找女朋友?

全世界有3.14 % 的人已经关注了数据与算法之美导读找女朋友不仅需要好眼力&#xff0c;还需要一些技术含量。比如眼下正热的大数据&#xff0c;可以认真钻研&#xff0c;用数据分析来实现自己的“脱单计划”。小猿25岁&#xff0c;单身男&#xff0c;热衷大数据&#xff0c;并决…

ASP.NET Core 单元测试:如何 Mock HttpContext.Features.Get()

点击上方蓝字关注“汪宇杰博客”导语在 ASP.NET Core 里&#xff0c;如果你想单元测试 HttpContext.Features.Get<SomeType>()&#xff0c;这个技巧一定不要错过。问题我有个 Error 页面&#xff0c;需要取得异常的详细信息。我使用 HttpContext.Features.Get<IExcept…

php 模拟登录163邮箱,PHP模拟登陆163邮箱发邮件及获取通讯录列表的方

本文实例讲述了PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;代码如下:header("Content-Type: text/html; charsetUTF-8");error_reporting(0);/*** 登陆* $user 163用户名* $pass 密码**/function login($u…