当前位置: 首页 > news >正文

[Json.net]快速入门

引言

有个朋友问了一个如何更方便的解析json格式字符串,之前也没怎么研究过json.net,就上网帮他查了一下,现学现卖的给他整了一个demo,这才发现json.net的强大,用着很方便。

Json

JSON(javasrcipt Object Notation)是一种轻量级的数据交换方式。拿最常见的应用举个例子,将javascript对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松的传递这个字符串,或者在异步应用程序中将字符串从web客户机传递给服务端程序。这个字符串虽然看起来比较古怪,但是javascript很容易解释它,而且json可以表示比“名称/值对”更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。

在.net中,DataContractJsonSerializer和JavaScriptSerializer这两个类,可以操作json。但性能上和json.net相比,差了很多。

可以借用官网的一张图看一下:

官网地址:http://james.newtonking.com/json

将下载的压缩文件解压,Source是源码文件夹,在bin目录下,Newtonsoft.Json.dll是编译后的程序集文件,在项目中应用该dll就行了。

Json.net

在项目中引用Newtonsoft.Json.dll。

首先从最简单的例子入手,序列化DataTable对象。

引入命名空间:

 using Newtonsoft.Json; 

测试代码:

 1 using Newtonsoft.Json;
 2 using System.Data;
 3 namespace Wolfy.JsonNetDemo
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             DataTable dt = new DataTable();
10             DataColumn name = new DataColumn("Name");
11             DataColumn gender = new DataColumn("Gender");
12             DataColumn address = new DataColumn("Address");
13             dt.Columns.Add(name);
14             dt.Columns.Add(gender);
15             dt.Columns.Add(address);
16             for (int i = 0; i < 10; i++)
17             {
18                 DataRow dr = dt.NewRow();
19                 dr[0] = "Name" + i;
20                 dr[1] = i%2==0?"":"";
21                 dr[2] = "Address" + i;
22                 dt.Rows.Add(dr);
23             }
24             //序列化为json
25             string json = JsonConvert.SerializeObject(dt);
26             Console.WriteLine(json);
27             Console.Read();
28         }
29     }
30 }

结果:

反序列化为Datatable

1  DataTable dt1 = JsonConvert.DeserializeObject<DataTable>(json);
2             for (int i = 0; i < dt1.Rows.Count; i++)
3             {
4                 DataRow dr = dt1.Rows[i];
5                 Console.WriteLine("{0}\t{1}\t{2}\t", dr[0], dr[1], dr[2]);
6             }

控制

实现对Json.net序列化和反序列化的控制,需要JsonSerializerSettings类。

  1 var jsonSetting = new JsonSerializerSettings(); 2 string json=JsonConvert.SerializeObject(object,jsonSetting); 

新建一个测试类:

1     public class Employee
2     {
3         public string Name { get; set; }
4         public int Age { set; get; }
5         public string Gender { set; get; }
6         public string DepartmentName { set; get; }
7         public Employee Leader { set; get; }
8     }

空值处理

针对应用类型,如果为NULL时,json.net如何处理,可以通过 jsonSetting.NullValueHandling的值来控制。如:

1             var jsonSetting = new JsonSerializerSettings();
2             jsonSetting.NullValueHandling = NullValueHandling.Ignore;
3             jsonSetting.NullValueHandling = NullValueHandling.Include;

一个例子:

 1             Employee employee = new Employee();
 2             employee.Name = "Wolfy";
 3             employee.Gender = "";
 4             employee.Age = 26;
 5             employee.DepartmentName = ".net开发";
 6             employee.Leader = null;
 7             var jsonSetting = new JsonSerializerSettings();
 8             jsonSetting.NullValueHandling = NullValueHandling.Ignore;
 9             string json = JsonConvert.SerializeObject(employee,jsonSetting);
10             Console.WriteLine(json);
11             Console.Read();

结果:

改为NullValueHandling.Include

结果:

默认值处理

对于值类型的处理,通过设置jsonSetting.DefaultValueHandling的值来确定。同样是枚举可取Ignore,Include等,如:

 1 namespace Newtonsoft.Json
 2 {
 3     [Flags]
 4     public enum DefaultValueHandling
 5     {
 6         Include = 0,
 7         Ignore = 1,
 8         Populate = 2,
 9         IgnoreAndPopulate = 3,
10     }
11 }

 jsonSetting.DefaultValueHandling = DefaultValueHandling.Ignore;//忽略默认值 

给Employee的成员使用特性   [DefaultValue(26)]设置默认值,并引入命名空间:System.ComponentModel

 1 [DefaultValue(26)] 2 public int Age { set; get; } 

忽略默认值:

 1             Employee employee = new Employee();
 2             employee.Name = "Wolfy";
 3             employee.Gender = "";
 4             employee.Age = 26;
 5             employee.DepartmentName = ".net开发";
 6             employee.Leader = null;
 7             var jsonSetting = new JsonSerializerSettings();
 8             jsonSetting.NullValueHandling = NullValueHandling.Include;
 9             jsonSetting.DefaultValueHandling = DefaultValueHandling.Ignore;//忽略默认值
10             string json = JsonConvert.SerializeObject(employee,jsonSetting);
11             Console.WriteLine(json);
12             Console.Read();

结果:

 

属性控制

 Json.net序列化的两种方式:OptOut和OptIn

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

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

 1 using Newtonsoft.Json;
 2 namespace Wolfy.JsonNetDemo
 3 {
 4     [JsonObject(Newtonsoft.Json.MemberSerialization.OptIn)]
 5     public class Employee
 6     {
 7         [JsonProperty]
 8         public string Name { get; set; }
 9         
10         public int Age { set; get; }
11         public string Gender { set; get; }
12         public string DepartmentName { set; get; }
13         public Employee Leader { set; get; }
14     }
15 }

序列化:

1             Employee employee = new Employee();
2             employee.Name = "Wolfy";
3             employee.Gender = "";
4             employee.Age = 26;
5             employee.DepartmentName = ".net开发";
6             employee.Leader = null;
7             string json = JsonConvert.SerializeObject(employee);
8             Console.WriteLine(json);

结果:

 如果想忽略某个属性,比如忽略领导信息。则可以这样写:

 1 namespace Wolfy.JsonNetDemo
 2 {
 3     [JsonObject(Newtonsoft.Json.MemberSerialization.OptOut)]
 4     public class Employee
 5     {
 6         public string Name { get; set; }
 7         
 8         public int Age { set; get; }
 9         public string Gender { set; get; }
10         public string DepartmentName { set; get; }
11         [JsonIgnore]
12         public Employee Leader { set; get; }
13     }
14 }

 [JsonObject(Newtonsoft.Json.MemberSerialization.OptOut)]可以不写,已经默认

测试:

1             Employee employee = new Employee();
2             employee.Name = "Wolfy";
3             employee.Gender = "";
4             employee.Age = 26;
5             employee.DepartmentName = ".net开发";
6             employee.Leader = new Employee() {Name = "老大",Gender = "",Age = 29, DepartmentName = ".net开发"};
7             string json = JsonConvert.SerializeObject(employee);
8             Console.WriteLine(json);

结果:

不忽略结果对比:

非公共成员序列化

 Json.net序列化对象,默认只序列化公共成员,非公共成员序列互时,需加上 [JsonProperty]特性。

日期处理

两种日期格式:IsoDateTimeConverter和JavaScriptDateTimeConverter

这是json.net中带的2个日期类,默认是IsoDateTimeConverter,格式“yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK”。另一个是JavaScriptDateTimeConverter,格式“new Date(ticks)”,返回Javascript的Date对象。

一个例子

 1     public class Employee
 2     {
 3         public string Name { get; set; }
 4         public int Age { set; get; }
 5         public string Gender { set; get; }
 6         public string DepartmentName { set; get; }
 7         //[JsonIgnore]
 8         public Employee Leader { set; get; }
 9         public DateTime BirthDay { set; get; }
10         public DateTime EmployeDate { set; get; }
11     }

序列化为Javascript格式:

 1             Employee employee = new Employee();
 2             employee.Name = "Wolfy";
 3             employee.Gender = "";
 4             employee.Age = 26;
 5             employee.DepartmentName = ".net开发";
 6             employee.Leader = new Employee() {Name = "老大",Gender = "",Age = 29, DepartmentName = ".net开发"};
 7             employee.BirthDay = new DateTime(1987,3,22);
 8             employee.EmployeDate = new DateTime(2011,6,22);
 9             string json = JsonConvert.SerializeObject(employee,new JavaScriptDateTimeConverter());
10             Console.WriteLine(json);

序列化

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

则可以通过设置特性实现

 1     public class Employee
 2     {
 3         public string Name { get; set; }
 4         public int Age { set; get; }
 5         public string Gender { set; get; }
 6         public string DepartmentName { set; get; }
 7         //[JsonIgnore]
 8         public Employee Leader { set; get; }
 9         [JsonConverter(typeof(IsoDateTimeConverter))]
10         public DateTime BirthDay { set; get; }
11         [JsonConverter(typeof(JavaScriptDateTimeConverter))]
12         public DateTime EmployeDate { set; get; }
13     }

结果:

自定义日期格式:

1             IsoDateTimeConverter newFormatTime = new IsoDateTimeConverter() { DateTimeFormat="yyyy年MM月dd日"};
2             string json = JsonConvert.SerializeObject(employee, newFormatTime);
3             Console.WriteLine(json);

结果:

总结

json.net简单操作就介绍到这里,之后总结Linq to json的用法。

参考

http://james.newtonking.com/json

http://www.360doc.com/content/13/0328/22/11741424_274568478.shtml

转载于:https://www.cnblogs.com/wolf-sun/p/3667258.html

相关文章:

  • getRequestURI,getRequestURL的区别
  • 2018年测试状况调查
  • 一个CCIE的梦想(转)
  • 如何快速找到多个字典中的公共键(key)
  • form表单的onclick与submit提交顺序
  • Linux下的五种错误配置
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • 关于研发成本的一些思考
  • ElasticSearch学习(9)-Java接口查询操作
  • 转载:C/C++关于string.h头文件和string类
  • 开源USM之HIDS ossec
  • SVN的标准目录结构:trunk、branches、tags(转)
  • hdu 2844 混合背包【背包dp】
  • MySQL高可用架构之MHA
  • Js基础知识(四) - js运行原理与机制
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • CSS魔法堂:Absolute Positioning就这个样
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ES学习笔记(12)--Symbol
  • Fastjson的基本使用方法大全
  • JavaScript设计模式之工厂模式
  • Linux下的乱码问题
  • React中的“虫洞”——Context
  • spark本地环境的搭建到运行第一个spark程序
  • WinRAR存在严重的安全漏洞影响5亿用户
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 记一次和乔布斯合作最难忘的经历
  • 前端技术周刊 2019-02-11 Serverless
  • 浅谈Golang中select的用法
  • 三栏布局总结
  • 微信小程序:实现悬浮返回和分享按钮
  • 第二十章:异步和文件I/O.(二十三)
  • ​Linux·i2c驱动架构​
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​力扣解法汇总946-验证栈序列
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #QT项目实战(天气预报)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (52)只出现一次的数字III
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (分布式缓存)Redis持久化
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (七)c52学习之旅-中断
  • (十三)Maven插件解析运行机制
  • (一)插入排序
  • (转)scrum常见工具列表
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .libPaths()设置包加载目录
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .netcore如何运行环境安装到Linux服务器
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • :“Failed to access IIS metabase”解决方法
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)