您的位置:首页 > Web前端 > JavaScript

[Json.net]快速入门

2014-11-29 13:44 357 查看


引言

有个朋友问了一个如何更方便的解析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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: