您现在的位置是:首页 >

数据交换有几种方式 使用JSON作为数据交换格式

火烧 2022-10-27 00:27:54 1103
使用JSON作为数据交换格式 我们知道在 NET中我们有多种对象序列化的方式 如XML方式序列化 Bi ary序列化 其中XML序列化是一种比较通用的在各语言之间传递数据的方式 除了这两种序列化方式之

使用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= 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作为数据交换格式
        //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序列化和反序列化的不二选择 lishixinzhi/Article/program/net/201311/13859  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码