在.NET使用JSON作为数据交换格式

我们知道在.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序列化和反序列化的不二选择。

时间: 2024-10-09 19:16:58

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

在.NET使用JSON作为数据交换格式(转)

我们知道在.NET中我们有多种对象序列化的方式,如XML方式序列化.Binary序列化,其中XML序列化是一种比较通用的在各语言之间传递数据的方式.除了这两种序列化方式之外,在.NET中还可以使用JSON序列化.JSON(JavaScript Object Notation)是一种轻量级轻量级的数据交换格式,并且它独立于编程语言,与XML序列化相比,JSON序列化后产生的数据一般要比XML序列化后数据体积小,所以在Facebook等知名网站中都采用了JSON作为数据交换方式.在.NET中有三种常

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

http://www.cnblogs.com/zhoufoxcn/archive/2011/03/16/2515611.html 我们知道在.NET中我们有多种对象序列化的方式,如XML方式序列化.Binary序列化,其中XML序列化是一种比较通用的在各语言之间传递数据的方式.除了这两种序列化方式之外,在.NET中还可以使用JSON序列化.JSON(JavaScript Object Notation)是一种轻量级轻量级的数据交换格式,并且它独立于编程语言,与XML序列化相比,JSON序列化后产

JSON 轻量级数据交换格式

JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,有效提高网络传输速度. JSON就是一串字符串 只不过元素会使用特定的符号标注. {} 双括号表示对象 [] 中括号表示数组 原文地址:https://www.cnblogs.com/dzj1/p/10757433.html

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

课程目标 XML和JSON Java反射机制 手写SpringIOC 什么是数据交换格式 客户端与服务器常用数据交换格式xml.json.html 数据交换格式用场景 移动端(安卓.IOS)通讯方式采用http协议+JSON格式 走restful风格. 很多互联网项目都采用Http协议+JSON 因为xml比较重WebService服务采用http+xml格式 银行项目使用比较多 数据交换格式 JSON简单使用 什么是JSON JSON(JavaScript Object Notation)是一

iOS 中 JSON 数据交换格式

     JSON (JavaScript Object Notation)是一种轻量级的数据交换格式.JSON 的具体教程,可以参见 JSON 中国:http://www.json.org.cn/index.htm ,当然还有 JSON 在线校验格式化工具:http://www.bejson.com/ ,希望深入学习 JSON 可以参考其他教程.JSON 的轻量级是相对于 XML 文档结构而言的,描述项目字符少,所以描述相同的数据所需的字符个数要少,当然传输的速度就会提高而流量也会减少.  

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

JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等). 这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. J

json 数据交换格式与java

http://wiki.mbalib.com/wiki/数据交换 数据交换是指为了满足不同信息系统之间数据资源的共享需要,依据一定的原则,采取相应的技术,实现不同信息系统之间数据资源共享的过程. 数据交换格式:需要交互的数据的封装格式: 主要考虑两点: 1)数据的组织: 2)数据类型的保真: http://baike.baidu.com/link?url=TPtlUBxpINIvU2Zc3NJDSlkDON133FUx3lp-IuNIzCHjfoRmZX8jgHUPrTbppDPffEXalnY

数据交换格式XML和JSON对比

1.简介: XML:extensible markup language,一种类似于HTML的语言,他没有预先定义的标签,使用DTD(document type definition)文档类型定义来组织数据:格式统一,跨平台和语言,早已成为业界公认的标准.具体的可以问Google或百度.相比之JSON这种轻量级的数据交换格式,XML可以称为重量级的了. JSON : JavaScript Object Notation 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基

2016/4/2 json:js和jquery中轻量级数据交换格式 例: 窗口弹出 popwindow

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). JSON 语法是 JavaScript 对象表示语法的子集. 数据在键值对中 数据由逗号分隔