原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhoufoxcn.blog.51cto.com/792419/517093

我们知道在.NET中我们有多种对象序列化的方式,如XML方式序列化、Binary序列化,其中XML序列化是一种比较通用的在各语言之间传递数据的方式。除了这两种序列化方式之外,在.NET中还可以使用JSON序列化。
JSON(JavaScript Object Notation)是一种轻量级轻量级的数据交换格式,并且它独立于编程语言,与XML序列化相比,JSON序列化后产生的数据一般要比XML序列化后数据体积小,所以在Facebook等知名网站中都采用了JSON作为数据交换方式。在.NET中有三种常用的JSON序列化的类,分别是System.Web.Script.Serialization.JavaScriptSerializer类、System.Runtime.Serialization.Json.DataContractJsonSerializer类和Newtonsoft.Json.JsonConvert类。
为了便于下面的演示,下面提供一个类的代码:
    [DataContract]
    public class User
    {
        /// <summary>
        /// 编号
        /// </summary>
        [DataMember]
        public int UserId { get; set; }
        /// <summary>
        /// 用户名
        /// </summary>
        [DataMember]
        public string UserName { get; set; }
        /// <summary>
        /// 创建时间
        /// </summary>
        [DataMember]
        [JsonConverter(typeof(IsoDateTimeConverter))]
        public DateTime CreateDate { get; set; }
        /// <summary>
        /// 生日
        /// </summary>
        [DataMember]
        [JsonConverter(typeof(JavaScriptDateTimeConverter))]
        public DateTime Birthday { get; set; }
        /// <summary>
        /// 相关URL
        /// </summary>
        [DataMember]
        public List<string> Urls { get; set; }
        /// <summary>
        /// 薪水
        /// </summary>
        //[ScriptIgnore]//使用JavaScriptSerializer序列化时不序列化此字段
        //[IgnoreDataMember]//使用DataContractJsonSerializer序列化时不序列化此字段
        //[JsonIgnore]//使用JsonConvert序列化时不序列化此字段
        public int Salary { get; set; }
        /// <summary>
        /// 权利级别
        /// </summary>
        [DataMember]
        public Priority Priority { get; set; }

public User()
        {
            Urls = new List<string>();
        }
    }
    /// <summary>
    /// 权利级别
    /// </summary>
    public enum Priority:byte
    {
        Lowest=0x1,
        BelowNormal=0x2,
        Normal=0x4,
        AboveNormal=0x8,
        Highest=0x16
    }
使用System.Web.Script.Serialization.JavaScriptSerializer类
System.Web.Script.Serialization.JavaScriptSerializer类是.NET类库中自带的一种JSON序列化实现,在.NET Framework3.5及以后版本中可以使用这个类,这个类位于System.Web.Extensions.dll中,使用这个类是必须添加对这个dll的引用。
下面的代码是使用JavaScriptSerializer进行序列化和反序列化的例子:
public static void JavaScriptSerializerDemo()
{
    User user = new User { UserId = 1, UserName = "李刚", CreateDate = DateTime.Now.AddYears(-30),Birthday=DateTime.Now.AddYears(-50), Priority = Priority.Highest, Salary = 500000 };
    //JavaScriptSerializer类在System.Web.Extensions.dll中,注意添加这个引用
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    //JSON序列化
    string result=serializer.Serialize(user);
    Console.WriteLine("使用JavaScriptSerializer序列化后的结果:{0},长度:{1}", result, result.Length);
    //JSON反序列化
    user = serializer.Deserialize<User>(result);
    Console.WriteLine("使用JavaScriptSerializer反序列化后的结果:UserId:{0},UserName:{1},CreateDate:{2},Priority:{3}", user.UserId, user.UserName, user.CreateDate, user.Priority);

}
说明:如果不想序列化某个字段,可以在字段前面加[JsonIgnore]标记。
使用System.Runtime.Serialization.Json.DataContractJsonSerializer类
System.Runtime.Serialization.Json.DataContractJsonSerializer类位于System.ServiceModel.Web.dll中,使用这个类时除了需要添加对System.ServiceModel.Web.dll的引用之外,还需要添加System.Runtime.Serialization.dll的引用,注意这个类也是在.NET Framework3.5及以后版本中可以使用。
下面是使用DataContractJsonSerializer类的例子:
public static void DataContractJsonSerializerDemo()
{
    User user = new User { UserId = 1, UserName = "李刚", CreateDate = DateTime.Now.AddYears(-30), Birthday = DateTime.Now.AddYears(-50), Priority = Priority.AboveNormal, Salary = 50000 };
    string result = string.Empty;
    //DataContractJsonSerializer类在System.ServiceModel.Web.dll中,注意添加这个引用
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(User));
    
    using (MemoryStream stream = new MemoryStream())
    {
        //JSON序列化
        serializer.WriteObject(stream, user);
        result = Encoding.UTF8.GetString(stream.ToArray());
        Console.WriteLine("使用DataContractJsonSerializer序列化后的结果:{0},长度:{1}", result, result.Length);
    }

//JSON反序列化
    byte[] buffer = Encoding.UTF8.GetBytes(result);
    using (MemoryStream stream = new MemoryStream(buffer))
    {
        user = serializer.ReadObject(stream) as User;
        Console.WriteLine("使用DataContractJsonSerializer反序列化后的结果:UserId:{0},UserName:{1},CreateDate:{2},Priority:{3}", user.UserId, user.UserName, user.CreateDate, user.Priority);
    }
}
注意:要使用DataContractJsonSerializer类进行序列化和反序列化,必须给类加上[DataContract]属性,对要序列化的字段加上[DataMember]属性,如果不想序列化某个字段或者属性,可以加上[IgnoreDataMember]属性。
使用Newtonsoft.Json.JsonConvert类
Newtonsoft.Json.JsonConvert类是非微软提供的一个JSON序列化和反序列的开源免费的类库(下载网址是:http://www.codeplex.com/json/),它提供了更灵活的序列化和反序列化控制,并且如果你的开发环境使用的是.NET Framework3.5及以后版本的话,你就可以使用Linq to JSON,这样一来面对一大段的数据不必一一解析,你可以使用Linq to JSON解析出你关心的那部分即可,非常方便。
下面是使用Newtonsoft.Json.JsonConvert类的例子:
public static void JsonConvertDemo()
{
    User user = new User { UserId = 1, UserName = "李刚", CreateDate = DateTime.Now.AddYears(-30), Birthday = DateTime.Now.AddYears(-50), Priority = Priority.BelowNormal, Salary = 5000 };
    //JsonConvert类在Newtonsoft.Json.Net35.dll中,注意到http://www.codeplex.com/json/下载这个dll并添加这个引用
    //JSON序列化
    string result = JsonConvert.SerializeObject(user);
    Console.WriteLine("使用JsonConvert序列化后的结果:{0},长度:{1}", result, result.Length);
    //JSON反序列化
    user = JsonConvert.DeserializeObject<User>(result);
    Console.WriteLine("使用JsonConvert反序列化后的结果:UserId:{0},UserName:{1},CreateDate:{2},Priority:{3}", user.UserId, user.UserName, user.CreateDate, user.Priority);
}

public static void JsonConvertLinqDemo()
{
    User user = new User { UserId = 1, UserName = "周公", CreateDate = DateTime.Now.AddYears(-8), Birthday = DateTime.Now.AddYears(-32), Priority = Priority.Lowest, Salary = 500, Urls = new List<string> { "http://zhoufoxcn.blog.51cto.com", "http://blog.csdn.net/zhoufoxcn" } };
    //JsonConvert类在Newtonsoft.Json.Net35.dll中,注意到http://www.codeplex.com/json/下载这个dll并添加这个引用
    //JSON序列化
    string result = JsonConvert.SerializeObject(user);
    Console.WriteLine("使用JsonConvert序列化后的结果:{0},长度:{1}", result, result.Length);
    //使用Linq to JSON
    JObject jobject = JObject.Parse(result);
    JToken token = jobject["Urls"];
    List<string> urlList = new List<string>();
    foreach (JToken t in token)
    {
        urlList.Add(t.ToString());
    }
    Console.Write("使用Linq to JSON反序列化后的结果:[");
    for (int i = 0; i < urlList.Count - 1;i++ )
    {
        Console.Write(urlList[i] + ",");
    }
    Console.WriteLine(urlList[urlList.Count - 1] + "]");
}
注意:如果有不需要序列化的字段,可以给该字段添加[JsonIgnore]标记。在Newtonsoft这个类库中对于日期的序列化有多种方式,可以类的DataTime成员添加上对应的标记,这样在进行序列化和反序列化时就会按照指定的方式进行,在本例中User类的CreateDate属性添加的属性是[JsonConverter(typeof(IsoDateTimeConverter))],而Birthday属性添加的属性是[JsonConverter(typeof(JavaScriptDateTimeConverter))],从序列化的结果可以看出来它们最终的表现形式并不一样。
本文中所有的示例代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Web.Script.Serialization;
  6. using System.Runtime.Serialization.Json;
  7. using System.IO;
  8. using System.Runtime.Serialization;
  9. using Newtonsoft.Json;
  10. using Newtonsoft.Json.Linq;
  11. using Newtonsoft.Json.Converters;
  12. namespace JSONDemo
  13. {
  14. class Program
  15. {
  16. static void Main(string[] args)
  17. {
  18. JavaScriptSerializerDemo();
  19. DataContractJsonSerializerDemo();
  20. JsonConvertDemo();
  21. JsonConvertLinqDemo();
  22. Console.ReadLine();
  23. }
  24. public static void JavaScriptSerializerDemo()
  25. {
  26. User user = new User { UserId = 1, UserName = "李刚", CreateDate = DateTime.Now.AddYears(-30),Birthday=DateTime.Now.AddYears(-50), Priority = Priority.Highest, Salary = 500000 };
  27. //JavaScriptSerializer类在System.Web.Extensions.dll中,注意添加这个引用
  28. JavaScriptSerializer serializer = new JavaScriptSerializer();
  29. //JSON序列化
  30. string result=serializer.Serialize(user);
  31. Console.WriteLine("使用JavaScriptSerializer序列化后的结果:{0},长度:{1}", result, result.Length);
  32. //JSON反序列化
  33. user = serializer.Deserialize<User>(result);
  34. Console.WriteLine("使用JavaScriptSerializer反序列化后的结果:UserId:{0},UserName:{1},CreateDate:{2},Priority:{3}", user.UserId, user.UserName, user.CreateDate, user.Priority);
  35. }
  36. public static void DataContractJsonSerializerDemo()
  37. {
  38. User user = new User { UserId = 1, UserName = "李刚", CreateDate = DateTime.Now.AddYears(-30), Birthday = DateTime.Now.AddYears(-50), Priority = Priority.AboveNormal, Salary = 50000 };
  39. string result = string.Empty;
  40. //DataContractJsonSerializer类在System.ServiceModel.Web.dll中,注意添加这个引用
  41. DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(User));
  42. using (MemoryStream stream = new MemoryStream())
  43. {
  44. //JSON序列化
  45. serializer.WriteObject(stream, user);
  46. result = Encoding.UTF8.GetString(stream.ToArray());
  47. Console.WriteLine("使用DataContractJsonSerializer序列化后的结果:{0},长度:{1}", result, result.Length);
  48. }
  49. //JSON反序列化
  50. byte[] buffer = Encoding.UTF8.GetBytes(result);
  51. using (MemoryStream stream = new MemoryStream(buffer))
  52. {
  53. user = serializer.ReadObject(stream) as User;
  54. Console.WriteLine("使用DataContractJsonSerializer反序列化后的结果:UserId:{0},UserName:{1},CreateDate:{2},Priority:{3}", user.UserId, user.UserName, user.CreateDate, user.Priority);
  55. }
  56. }
  57. public static void JsonConvertDemo()
  58. {
  59. User user = new User { UserId = 1, UserName = "李刚", CreateDate = DateTime.Now.AddYears(-30), Birthday = DateTime.Now.AddYears(-50), Priority = Priority.BelowNormal, Salary = 5000 };
  60. //JsonConvert类在Newtonsoft.Json.Net35.dll中,注意到http://www.codeplex.com/json/下载这个dll并添加这个引用
  61. //JSON序列化
  62. string result = JsonConvert.SerializeObject(user);
  63. Console.WriteLine("使用JsonConvert序列化后的结果:{0},长度:{1}", result, result.Length);
  64. //JSON反序列化
  65. user = JsonConvert.DeserializeObject<User>(result);
  66. Console.WriteLine("使用JsonConvert反序列化后的结果:UserId:{0},UserName:{1},CreateDate:{2},Priority:{3}", user.UserId, user.UserName, user.CreateDate, user.Priority);
  67. }
  68. public static void JsonConvertLinqDemo()
  69. {
  70. User user = new User { UserId = 1, UserName = "周公", CreateDate = DateTime.Now.AddYears(-8), Birthday = DateTime.Now.AddYears(-32), Priority = Priority.Lowest, Salary = 500, Urls = new List<string> { "http://zhoufoxcn.blog.51cto.com", "http://blog.csdn.net/zhoufoxcn" } };
  71. //JsonConvert类在Newtonsoft.Json.Net35.dll中,注意到http://www.codeplex.com/json/下载这个dll并添加这个引用
  72. //JSON序列化
  73. string result = JsonConvert.SerializeObject(user);
  74. Console.WriteLine("使用JsonConvert序列化后的结果:{0},长度:{1}", result, result.Length);
  75. //使用Linq to JSON
  76. JObject jobject = JObject.Parse(result);
  77. JToken token = jobject["Urls"];
  78. List<string> urlList = new List<string>();
  79. foreach (JToken t in token)
  80. {
  81. urlList.Add(t.ToString());
  82. }
  83. Console.Write("使用Linq to JSON反序列化后的结果:[");
  84. for (int i = 0; i < urlList.Count - 1;i++ )
  85. {
  86. Console.Write(urlList[i] + ",");
  87. }
  88. Console.WriteLine(urlList[urlList.Count - 1] + "]");
  89. }
  90. }
  91. [DataContract]
  92. public class User
  93. {
  94. /// <summary>
  95. /// 编号
  96. /// </summary>
  97. [DataMember]
  98. public int UserId { get; set; }
  99. /// <summary>
  100. /// 用户名
  101. /// </summary>
  102. [DataMember]
  103. public string UserName { get; set; }
  104. /// <summary>
  105. /// 创建时间
  106. /// </summary>
  107. [DataMember]
  108. [JsonConverter(typeof(IsoDateTimeConverter))]
  109. public DateTime CreateDate { get; set; }
  110. /// <summary>
  111. /// 生日
  112. /// </summary>
  113. [DataMember]
  114. [JsonConverter(typeof(JavaScriptDateTimeConverter))]
  115. public DateTime Birthday { get; set; }
  116. /// <summary>
  117. /// 相关URL
  118. /// </summary>
  119. [DataMember]
  120. public List<string> Urls { get; set; }
  121. /// <summary>
  122. /// 薪水
  123. /// </summary>
  124. [ScriptIgnore]//使用JavaScriptSerializer序列化时不序列化此字段
  125. [IgnoreDataMember]//使用DataContractJsonSerializer序列化时不序列化此字段
  126. [JsonIgnore]//使用JsonConvert序列化时不序列化此字段
  127. public int Salary { get; set; }
  128. /// <summary>
  129. /// 权利级别
  130. /// </summary>
  131. [DataMember]
  132. public Priority Priority { get; set; }
  133. public User()
  134. {
  135. Urls = new List<string>();
  136. }
  137. }
  138. /// <summary>
  139. /// 权利级别
  140. /// </summary>
  141. public enum Priority:byte
  142. {
  143. Lowest=0x1,
  144. BelowNormal=0x2,
  145. Normal=0x4,
  146. AboveNormal=0x8,
  147. Highest=0x16
  148. }
  149. }

程序的运行结果如下:

  1. 使用JavaScriptSerializer序列化后的结果:{"UserId":1,"UserName":"李刚","CreateDate":"\/Date(353521211984)\/","Birthday":"\/Date(-277630788015)\/","Urls":[],"Priority":22},长度:127
  2. 使用JavaScriptSerializer反序列化后的结果:UserId:1,UserName:李刚,CreateDate:1981-3-15 16:20:11,Priority:Highest
  3. 使用DataContractJsonSerializer序列化后的结果:{"Birthday":"\/Date(-277630787953+0800)\/","CreateDate":"\/Date(353521212046+0800)\/","Priority":8,"Urls":[],"UserId":1,"UserName":"李刚"},长度:136
  4. 使用DataContractJsonSerializer反序列化后的结果:UserId:1,UserName:李刚,CreateDate:1981-3-16 0:20:12,Priority:AboveNormal
  5. 使用JsonConvert序列化后的结果:{"UserId":1,"UserName":"李刚","CreateDate":"1981-03-16T00:20:12.1875+08:00","Birthday":new Date(-277630787812),"Urls":[],"Priority":2},长度:132
  6. 使用JsonConvert反序列化后的结果:UserId:1,UserName:李刚,CreateDate:1981-3-16 0:20:12,Priority:BelowNormal
  7. 使用JsonConvert序列化后的结果:{"UserId":1,"UserName":"周公","CreateDate":"2003-03-16T00:20:12.40625+08:00","Birthday":new Date(290362812406),"Urls":["http://zhoufoxcn.blog.51cto.com","http://blog.csdn.net/zhoufoxcn"],"Priority":1},长度:198
  8. 使用Linq to JSON反序列化后的结果:["http://zhoufoxcn.blog.51cto.com","http://blog.csdn.net/zhoufoxcn"]

总结:通过上面的例子大家可以看出Newtonsoft类库提供的JSON序列化和反序列的方式更加灵活,在实际开发中周公也一直使用Newtonsoft作为JSON序列化和反序列化的不二选择。

周公
2011-03-16

本文出自 “周公(周金桥)的专栏” 博客,请务必保留此出处http://zhoufoxcn.blog.51cto.com/792419/517093

在.NET使用JSON作为数据交换格式的更多相关文章

  1. 在.NET使用JSON作为数据交换格式【转】

    http://www.cnblogs.com/zhoufoxcn/archive/2011/03/16/2515611.html 我们知道在.NET中我们有多种对象序列化的方式,如XML方式序列化.B ...

  2. 数据交换格式与SpringIOC底层实现

    1.数据交换格式 1.1 有哪些数据交换格式 客户端与服务器常用数据交换格式xml.json.html 1.2 数据交换格式应用场景 1.2.1 移动端(安卓.iOS)通讯方式采用http协议+JSO ...

  3. 【学习】006数据交换格式与SpringIOC底层实现

    课程目标 XML和JSON Java反射机制 手写SpringIOC 什么是数据交换格式 客户端与服务器常用数据交换格式xml.json.html 数据交换格式用场景 移动端(安卓.IOS)通讯方式采 ...

  4. json 数据交换格式与java

    http://wiki.mbalib.com/wiki/数据交换 数据交换是指为了满足不同信息系统之间数据资源的共享需要,依据一定的原则,采取相应的技术,实现不同信息系统之间数据资源共享的过程. 数据 ...

  5. 常用两种数据交换格式之XML和JSON的比较

    目前,在web开发领域,主要的数据交换格式有XML和JSON,对于XML相信每一个web developer都不会感到陌生: 相比之下,JSON可能对于一些新步入开发领域的新手会感到有些陌生,也可能你 ...

  6. XML和JSON两种数据交换格式的比较

    在web开发领域,主要的数据交换格式有XML和JSON,对于在 Ajax开发中,是选择XML还是JSON,一直存在着争议,个人还是比较倾向于JSON的.一般都输出Json不输出xml,原因就是因为 x ...

  7. Java 常见数据交换格式——xml、json、yaml

    目录 数据交换格式介绍 XML 使用DOM方式解析 使用SAX方式解析 使用DOM4J方式解析 使用JDOM方式解析 JSON 使用JSONObject方式将数据转换为JSON格式 利用JSONObj ...

  8. JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式

    JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 它基于JavaScript(Standard ECMA-262 3rd Edition - D ...

  9. 数据交换格式 —— JSON(JavaScript Object Notation)

    当请求 headers 中,添加一个name为 Accept,值为 application/json 的 header(也即"我"(浏览器)接收的是 json 格式的数据),这样, ...

随机推荐

  1. Jython概要

    1.安装jython 1.1 进入http://www.jython.org/downloads.html ,网页上会显示当前最稳定的版本(The most current stable releas ...

  2. MVC3中,在control里面三种Html代码输出形式

    MVC3中,在control里面三种Html代码输出形式:ViewData["msg"] = "<br /> Title <br />" ...

  3. MySQL 约束的讲解

    MySQL 约束 作用:保证数据的完整性和一致性按照约束的作用范围分为:表级约束和行级约束.常见的约束类型包括: Not null(非空约束) Primary key (主键约束) Unique ke ...

  4. C语言 文件操作7--文件错误处理

    //文件错误处理 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include&l ...

  5. 事务的四个特性-ACID

    事务是恢复和并发控制的基本单位.   事务应该具有4个属性:原子性.一致性.隔离性.持久性.这四个属性通常称为ACID特性.   原子性(atomicity):一个事务是一个不可分割的工作单位,事务中 ...

  6. 关于错误提示:此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的解决方案

    vs上的一个项目,弄了一个aes加密算法.提示说:调用的目标异常.此实现不是 Windows 平台 FIPS 验证的加密算法的一部分.弄了好久一直不行.解决不了.最后找了半天资料终于解决了.估计下来. ...

  7. 构建高转化率的着陆页-PS+HTML+网络营销

    课程简介 本课程是全网独家专业的着陆页课程,课程完整的再现了整个着陆页实战案例的开发过程,包括:策划.设计和实现.上线后的推广.优化及提高转化率的技巧等,本套课程能帮助您迅速掌握着陆页的能力,迅速洞察 ...

  8. Android Studio Gradle编译项目报错

    Gradle project sync failed Android Studio每次更新版本都会更新Gradle这个插件,但由于长城的问题每次更新都是失败,又是停止在Refreshing Gradl ...

  9. windows下git bash显示中文

    1.C:\Program Files\Git\etc\git-completion.bash: alias ls='ls --show-control-chars --color=auto' 说明:使 ...

  10. win10快捷键大全 win10常用快捷键

    win10快捷键大全大家可以来了解一下,今天小编带来了win10常用快捷键,很多朋友喜欢使用快捷键来操作电脑,那么Windows10系统有哪些新的快捷键呢• 贴靠窗口:Win +左/右> Win ...