知识大全 使用JSON作为数据交换格式
Posted 长度
篇首语:人凭志气,虎凭威势。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用JSON作为数据交换格式相关的知识,希望对你有一定的参考价值。
使用JSON作为数据交换格式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
我们知道在 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= x BelowNormal= x Normal= x AboveNormal= x Highest= x 使用System Web Script Serialization JavaScriptSerializer类 System Web Script Serialization JavaScriptSerializer类是 NET类库中自带的一种JSON序列化实现 在 NET Framework 及以后版本中可以使用这个类 这个类位于System Web Extensions dll中 使用这个类是必须添加对这个dll的引用 下面的代码是使用JavaScriptSerializer进行序列化和反序列化的例子 public static void JavaScriptSerializerDemo() User user = new User UserId = UserName = 李刚 CreateDate = DateTime Now AddYears( ) Birthday=DateTime Now AddYears( ) Priority = Priority Highest Salary = ; //JavaScriptSerializer类在System Web Extensions dll中 注意添加这个引用 JavaScriptSerializer serializer = new JavaScriptSerializer() //JSON序列化 string result=serializer Serialize(user) Console WriteLine( 使用JavaScriptSerializer序列化后的结果 长度 result result Length) //JSON反序列化 user = serializer Deserialize<User>(result) Console WriteLine( 使用JavaScriptSerializer反序列化后的结果 UserId: UserName: CreateDate: Priority: 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 Framework 及以后版本中可以使用 下面是使用DataContractJsonSerializer类的例子 public static void DataContractJsonSerializerDemo() User user = new User UserId = UserName = 李刚 CreateDate = DateTime Now AddYears( ) Birthday = DateTime Now AddYears( ) Priority = Priority AboveNormal Salary = ; 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 UTF GetString(stream ToArray()) Console WriteLine( 使用DataContractJsonSerializer序列化后的结果 长度 result result Length) //JSON反序列化 byte[] buffer = Encoding UTF GetBytes(result) using (MemoryStream stream = new MemoryStream(buffer)) user = serializer ReadObject(stream) as User; Console WriteLine( 使用DataContractJsonSerializer反序列化后的结果 UserId: UserName: CreateDate: Priority: user UserId user UserName user CreateDate user Priority) 注意 要使用DataContractJsonSerializer类进行序列化和反序列化 必须给类加上[DataContract]属性 对要序列化的字段加上[DataMember]属性 如果不想序列化某个字段或者属性 可以加上[IgnoreDataMember]属性 使用Newtonsoft Json JsonConvert类 Newtonsoft Json JsonConvert类是非微软提供的一个JSON序列化和反序列的开源免费的类库(下载网址是 ) 它提供了更灵活的序列化和反序列化控制 并且如果你的开发环境使用的是 NET Framework 及以后版本的话 你就可以使用Linq to JSON 这样一来面对一大段的数据不必一一解析 你可以使用Linq to JSON解析出你关心的那部分即可 非常方便 下面是使用Newtonsoft Json JsonConvert类的例子 public static void JsonConvertDemo() User user = new User UserId = UserName = 李刚 CreateDate = DateTime Now AddYears( ) Birthday = DateTime Now AddYears( ) Priority = Priority BelowNormal Salary = ; //JsonConvert类在Newtonsoft Json Net dll中 注意到下载这个dll并添加这个引用 //JSON序列化 string result = JsonConvert SerializeObject(user) Console WriteLine( 使用JsonConvert序列化后的结果 长度 result result Length) //JSON反序列化 user = JsonConvert DeserializeObject<User>(result) Console WriteLine( 使用JsonConvert反序列化后的结果 UserId: UserName: CreateDate: Priority: user UserId user UserName user CreateDate user Priority) public static void JsonConvertLinqDemo() User user = new User UserId = UserName = 周公 CreateDate = DateTime Now AddYears( ) Birthday = DateTime Now AddYears( ) Priority = Priority Lowest Salary = Urls = new List<string> ; //JsonConvert类在Newtonsoft Json Net dll中 注意到下载这个dll并添加这个引用 //JSON序列化 string result = JsonConvert SerializeObject(user) Console WriteLine( 使用JsonConvert序列化后的结果 长度 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 = ; i < urlList Count ;i++ ) Console Write(urlList[i] + ) Console WriteLine(urlList[urlList Count ] + ] ) 注意 如果有不需要序列化的字段 可以给该字段添加[JsonIgnore]标记 在Newtonsoft这个类库中对于日期的序列化有多种方式 可以类的DataTime成员添加上对应的标记 这样在进行序列化和反序列化时就会按照指定的方式进行 在本例中User类的CreateDate属性添加的属性是[JsonConverter(typeof(IsoDateTimeConverter))] 而Birthday属性添加的属性是[JsonConverter(typeof(JavaScriptDateTimeConverter))] 从序列化的结果可以看出来它们最终的表现形式并不一样 本文中所有的示例代码如下 using System; using System Collections Generic; using System Linq; using System Text; using System Web Script Serialization; using System Runtime Serialization Json; using System IO; using System Runtime Serialization; using Newtonsoft Json; using Newtonsoft Json Linq; using Newtonsoft Json Converters; namespace JSONDemo class Program static void Main(string[] args) JavaScriptSerializerDemo() DataContractJsonSerializerDemo() JsonConvertDemo() JsonConvertLinqDemo() Console ReadLine() public static void JavaScriptSerializerDemo() User user = new User UserId = UserName = 李刚 CreateDate = DateTime Now AddYears( ) Birthday=DateTime Now AddYears( ) Priority = Priority Highest Salary = ; //JavaScriptSerializer类在System Web Extensions dll中 注意添加这个引用 JavaScriptSerializer serializer = new JavaScriptSerializer() //JSON序列化 string result=serializer Serialize(user) Console WriteLine( 使用JavaScriptSerializer序列化后的结果 长度 result result Length) //JSON反序列化 user = serializer Deserialize<User>(result) Console WriteLine( 使用JavaScriptSerializer反序列化后的结果 UserId: UserName: CreateDate: Priority: user UserId user UserName user CreateDate user Priority) public static void DataContractJsonSerializerDemo() User user = new User UserId = UserName = 李刚 CreateDate = DateTime Now AddYears( ) Birthday = DateTime Now AddYears( ) Priority = Priority AboveNormal Salary = ; 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 UTF GetString(stream ToArray()) Console WriteLine( 使用DataContractJsonSerializer序列化后的结果 长度 result result Length) //JSON反序列化 byte[] buffer = Encoding UTF GetBytes(result) using (MemoryStream stream = new MemoryStream(buffer)) user = serializer ReadObject(stream) as User; Console WriteLine( 使用DataContractJsonSerializer反序列化后的结果 UserId: UserName: CreateDate: Priority: user UserId user UserName user CreateDate user Priority) public static void JsonConvertDemo() User user = new User UserId = UserName = 李刚 CreateDate = DateTime Now AddYears( ) Birthday = DateTime Now AddYears( ) Priority = Priority BelowNormal Salary = ; //JsonConvert类在Newtonsoft Json Net dll中 注意到下载这个dll并添加这个引用 //JSON序列化 string result = JsonConvert SerializeObject(user) Console WriteLine( 使用JsonConvert序列化后的结果 长度 result result Length) //JSON反序列化 user = JsonConvert DeserializeObject<User>(result) Console WriteLine( 使用JsonConvert反序列化后的结果 UserId: UserName: CreateDate: Priority: user UserId user UserName user CreateDate user Priority) public static void JsonConvertLinqDemo() User user = new User UserId = UserName = 周公 CreateDate = DateTime Now AddYears( ) Birthday = DateTime Now AddYears( ) Priority = Priority Lowest Salary = Urls = new List<string> ; //JsonConvert类在Newtonsoft Json Net dll中 注意到下载这个dll并添加这个引用 //JSON序列化 string result = JsonConvert SerializeObject(user) Console WriteLine( 使用JsonConvert序列化后的结果 长度 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 = ; i < urlList Count ;i++ ) Console Write(urlList[i] + ) Console WriteLine(urlList[urlList Count ] + ] ) [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= x BelowNormal= x Normal= x AboveNormal= x Highest= x 程序的运行结果如下 [x] 使用JavaScriptSerializer序列化后的结果 UserId : UserName : 李刚 CreateDate : //Date( )// Birthday : //Date( )// Urls :[] Priority : 长度 使用JavaScriptSerializer反序列化后的结果 UserId: UserName:李刚 CreateDate: : : Priority:Highest 使用DataContractJsonSerializer序列化后的结果 Birthday : //Date( + )// CreateDate : //Date( + )// Priority : Urls :[] UserId : UserName : 李刚 长度 使用DataContractJsonSerializer反序列化后的结果 UserId: UserName:李刚 CreateDate: : : Priority:AboveNormal 使用JsonConvert序列化后的结果 UserId : UserName : 李刚 CreateDate : T : : + : Birthday :new Date( ) Urls :[] Priority : 长度 使用JsonConvert反序列化后的结果 UserId: UserName:李刚 CreateDate: : : Priority:BelowNormal 使用JsonConvert序列化后的结果 UserId : UserName : 周公 CreateDate : T : : + : Birthday :new Date( ) Urls :[ ] Priority : 长度 使用Linq to JSON反序列化后的结果 [ ] 总结 通过上面的例子大家可以看出Newtonsoft类库提供的JSON序列化和反序列的方式更加灵活 在实际开发中周公也一直使用Newtonsoft作为JSON序列化和反序列化的不二选择 cha138/Article/program/net/201311/13859相关参考
DataTable转为JSON数据格式代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 做项目
解析PHP使用curl提交json格式数据 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本篇文章是
<?php //需要执行的SQL语句//单条$sql="selectidnamefromtbl_userwhereid=";//多条数据//$sql="selectidnamefromtb
知识大全 服务端拼接json数据格式的正确写法(Append方式)
服务端拼接json数据格式的正确写法(Append方式) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
格式化json日期格式对象 调用toDate(timeString) /** *时间对象的格式化 */ Dateprototypeformat=function(format) /*
知识大全 JS无限极树形菜单,json格式、数组格式通用示例
JS无限极树形菜单,json格式、数组格式通用示例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本
知识大全 浅析Js(Jquery)中,字符串与JSON格式互相转换的示例
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
知识大全 asp.net后台cs中的JSON格式变量在前台Js中调用方法
asp.net后台cs中的JSON格式变量在前台Js中调用方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
【序列化的概念】 序列化是将对象状态转换为可保持或可传输的格式的过程与序列化相对的是反序列化它将流转换为对象这两个过程结合起来可以轻松地存储和传输数据 将对象的状态信息转换为可以存储或传输的窗
使用PHP接收POST数据,解析json数据 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本篇文章