熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

使用JSON作為數據交換格式

2013-11-13 10:30:42  來源: .NET編程 
    我們知道在NET中我們有多種對象序列化的方式如XML方式序列化Binary序列化其中XML序列化是一種比較通用的在各語言之間傳遞數據的方式除了這兩種序列化方式之外NET中還可以使用JSON序列化
   
    JSON(JavaScript Object Notation)是一種輕量級輕量級的數據交換格式並且它獨立於編程語言與XML序列化相比JSON序列化後產生的數據一般要比XML序列化後數據體積小所以在Facebook等知名網站中都采用了JSON作為數據交換方式NET中有三種常用的JSON序列化的類分別是SystemWebScriptSerializationJavaScriptSerializer類SystemRuntimeSerializationJsonDataContractJsonSerializer類和NewtonsoftJsonJsonConvert類
   
    為了便於下面的演示下面提供一個類的代碼
   
    [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
   
    }
   
    使用SystemWebScriptSerializationJavaScriptSerializer類
   
    SystemWebScriptSerializationJavaScriptSerializer類是NET類庫中自帶的一種JSON序列化實現NET Framework及以後版本中可以使用這個類這個類位於SystemWebExtensionsdll中使用這個類是必須添加對這個dll的引用


   
    下面的代碼是使用JavaScriptSerializer進行序列化和反序列化的例子
   
    public static void JavaScriptSerializerDemo()
   
    {
   
    User user = new User { UserId = UserName = 李剛 CreateDate = DateTimeNowAddYears(Birthday=DateTimeNowAddYears( Priority = PriorityHighest Salary = };
   
    //JavaScriptSerializer類在SystemWebExtensionsdll中注意添加這個引用
   
    JavaScriptSerializer serializer = new JavaScriptSerializer()
   
    //JSON序列化
   
    string result=serializerSerialize(user)
   
    ConsoleWriteLine(使用JavaScriptSerializer序列化後的結果{}長度{} result resultLength)
   
    //JSON反序列化
   
    user = serializerDeserialize<User>(result)
   
    ConsoleWriteLine(使用JavaScriptSerializer反序列化後的結果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
   
    }
   
    說明如果不想序列化某個字段可以在字段前面加[JsonIgnore]標記
   
    使用SystemRuntimeSerializationJsonDataContractJsonSerializer類
   
    SystemRuntimeSerializationJsonDataContractJsonSerializer類位於SystemServiceModelWebdll中使用這個類時除了需要添加對SystemServiceModelWebdll的引用之外還需要添加SystemRuntimeSerializationdll的引用注意這個類也是在NET Framework及以後版本中可以使用
   
    下面是使用DataContractJsonSerializer類的例子
   
    public static void DataContractJsonSerializerDemo()
   
    {
   
    User user = new User { UserId = UserName = 李剛 CreateDate = DateTimeNowAddYears( Birthday = DateTimeNowAddYears( Priority = PriorityAboveNormal Salary = };
   
    string result = stringEmpty;
   
    //DataContractJsonSerializer類在SystemServiceModelWebdll中注意添加這個引用
   
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(User))
   
    using (MemoryStream stream = new MemoryStream())
   
    {
   
    //JSON序列化
   
    serializerWriteObject(stream user)
   
    result = EncodingUTFGetString(streamToArray())
   
    ConsoleWriteLine(使用DataContractJsonSerializer序列化後的結果{}長度{} result resultLength)
   
    }
   
    //JSON反序列化
   
    byte[] buffer = EncodingUTFGetBytes(result)
   
    using (MemoryStream stream = new MemoryStream(buffer))
   
    {
   
    user = serializerReadObject(stream) as User;
   
    ConsoleWriteLine(使用DataContractJsonSerializer反序列化後的結果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
   
    }
   
    }
   
    注意要使用DataContractJsonSerializer類進行序列化和反序列化必須給類加上[DataContract]屬性對要序列化的字段加上[DataMember]屬性如果不想序列化某個字段或者屬性可以加上[IgnoreDataMember]屬性


   
    使用NewtonsoftJsonJsonConvert類
   
    NewtonsoftJsonJsonConvert類是非微軟提供的一個JSON序列化和反序列的開源免費的類庫(下載網址是它提供了更靈活的序列化和反序列化控制並且如果你的開發環境使用的是NET Framework及以後版本的話你就可以使用Linq to JSON這樣一來面對一大段的數據不必一一解析你可以使用Linq to JSON解析出你關心的那部分即可非常方便
   
    下面是使用NewtonsoftJsonJsonConvert類的例子
   
    public static void JsonConvertDemo()
   
    {
   
    User user = new User { UserId = UserName = 李剛 CreateDate = DateTimeNowAddYears( Birthday = DateTimeNowAddYears( Priority = PriorityBelowNormal Salary = };
   
    //JsonConvert類在NewtonsoftJsonNetdll中注意到下載這個dll並添加這個引用
   
    //JSON序列化
   
    string result = JsonConvertSerializeObject(user)
   
    ConsoleWriteLine(使用JsonConvert序列化後的結果{}長度{} result resultLength)
   
    //JSON反序列化
   
    user = JsonConvertDeserializeObject<User>(result)
   
    ConsoleWriteLine(使用JsonConvert反序列化後的結果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
   
    }
   
    public static void JsonConvertLinqDemo()
   
    {
   
    User user = new User { UserId = UserName = 周公 CreateDate = DateTimeNowAddYears( Birthday = DateTimeNowAddYears( Priority = PriorityLowest Salary = Urls = new List<string> { } };
   
    //JsonConvert類在NewtonsoftJsonNetdll中注意到下載這個dll並添加這個引用
   
    //JSON序列化
   
    string result = JsonConvertSerializeObject(user)
   
    ConsoleWriteLine(使用JsonConvert序列化後的結果{}長度{} result resultLength)
   
    //使用Linq to JSON
   
    JObject jobject = JObjectParse(result)
   
    JToken token = jobject[Urls];
   
    List<string> urlList = new List<string>()
   
    foreach (JToken t in token)
   
    {
   
    urlListAdd(tToString())
   
    }
   
    ConsoleWrite(使用Linq to JSON反序列化後的結果[
   
    for (int i = ; i < urlListCount ;i++ )
   
    {
   
    ConsoleWrite(urlList[i] +
   
    }
   
    ConsoleWriteLine(urlList[urlListCount ] + ]
   
    }
   
    注意如果有不需要序列化的字段可以給該字段添加[JsonIgnore]標記在Newtonsoft這個類庫中對於日期的序列化有多種方式可以類的DataTime成員添加上對應的標記這樣在進行序列化和反序列化時就會按照指定的方式進行在本例中User類的CreateDate屬性添加的屬性是[JsonConverter(typeof(IsoDateTimeConverter))]而Birthday屬性添加的屬性是[JsonConverter(typeof(JavaScriptDateTimeConverter))]從序列化的結果可以看出來它們最終的表現形式並不一樣
   


    本文中所有的示例代碼如下
   
    using System;
   
    using SystemCollectionsGeneric;
   
    using SystemLinq;
   
    using SystemText;
   
    using SystemWebScriptSerialization;
   
    using SystemRuntimeSerializationJson;
   
    using SystemIO;
   
    using SystemRuntimeSerialization;
   
    using NewtonsoftJson;
   
    using NewtonsoftJsonLinq;
   
    using NewtonsoftJsonConverters;
   
    namespace JSONDemo
   
    {
   
    class Program
   
    {
   
    static void Main(string[] args)
   
    {
   
    JavaScriptSerializerDemo()
   
    DataContractJsonSerializerDemo()
   
    JsonConvertDemo()
   
    JsonConvertLinqDemo()
   
    ConsoleReadLine()
   
    }
   
    public static void JavaScriptSerializerDemo()
   
    {
   
    User user = new User { UserId = UserName = 李剛 CreateDate = DateTimeNowAddYears(Birthday=DateTimeNowAddYears( Priority = PriorityHighest Salary = };
   
    //JavaScriptSerializer類在SystemWebExtensionsdll中注意添加這個引用
   
    JavaScriptSerializer serializer = new JavaScriptSerializer()
   
    //JSON序列化
   
    string result=serializerSerialize(user)
   
    ConsoleWriteLine(使用JavaScriptSerializer序列化後的結果{}長度{} result resultLength)
   
    //JSON反序列化
   
    user = serializerDeserialize<User>(result)
   
    ConsoleWriteLine(使用JavaScriptSerializer反序列化後的結果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
   
    }
   
    public static void DataContractJsonSerializerDemo()
   
    {
   
    User user = new User { UserId = UserName = 李剛 CreateDate = DateTimeNowAddYears( Birthday = DateTimeNowAddYears( Priority = PriorityAboveNormal Salary = };
   
    string result = stringEmpty;
   
    //DataContractJsonSerializer類在SystemServiceModelWebdll中注意添加這個引用
   
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(User))
   
    using (MemoryStream stream = new MemoryStream())
   
    {
   
    //JSON序列化
   
    serializerWriteObject(stream user)
   
    result = EncodingUTFGetString(streamToArray())
   
    ConsoleWriteLine(使用DataContractJsonSerializer序列化後的結果{}長度{} result resultLength)
   
    }
   
    //JSON反序列化
   
    byte[] buffer = EncodingUTFGetBytes(result)
   
    using (MemoryStream stream = new MemoryStream(buffer))
   
    {
   
    user = serializerReadObject(stream) as User;
   
    ConsoleWriteLine(使用DataContractJsonSerializer反序列化後的結果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
   
    }
   
    }
   
    public static void JsonConvertDemo()
   
    {
   
    User user = new User { UserId = UserName = 李剛 CreateDate = DateTimeNowAddYears( Birthday = DateTimeNowAddYears( Priority = PriorityBelowNormal Salary = };
   
    //JsonConvert類在NewtonsoftJsonNetdll中注意到下載這個dll並添加這個引用


   
    //JSON序列化
   
    string result = JsonConvertSerializeObject(user)
   
    ConsoleWriteLine(使用JsonConvert序列化後的結果{}長度{} result resultLength)
   
    //JSON反序列化
   
    user = JsonConvertDeserializeObject<User>(result)
   
    ConsoleWriteLine(使用JsonConvert反序列化後的結果UserId:{}UserName:{}CreateDate:{}Priority:{} userUserId userUserName userCreateDate userPriority)
   
    }
   
    public static void JsonConvertLinqDemo()
   
    {
   
    User user = new User { UserId = UserName = 周公 CreateDate = DateTimeNowAddYears( Birthday = DateTimeNowAddYears( Priority = PriorityLowest Salary = Urls = new List<string> { } };
   
    //JsonConvert類在NewtonsoftJsonNetdll中注意到下載這個dll並添加這個引用
   
    //JSON序列化
   
    string result = JsonConvertSerializeObject(user)
   
    ConsoleWriteLine(使用JsonConvert序列化後的結果{}長度{} result resultLength)
   
    //使用Linq to JSON
   
    JObject jobject = JObjectParse(result)
   
    JToken token = jobject[Urls];
   
    List<string> urlList = new List<string>()
   
    foreach (JToken t in token)
   
    {
   
    urlListAdd(tToString())
   
    }
   
    ConsoleWrite(使用Linq to JSON反序列化後的結果[
   
    for (int i = ; i < urlListCount ;i++ )
   
    {
   
    ConsoleWrite(urlList[i] +
   
    }
   
    ConsoleWriteLine(urlList[urlListCount ] + ]
   
    }
   
    }
   
    [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
   
    }
   
    }
   
    程序的運行結果如下
   
    [xhtml]
   
    使用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序列化和反序列化的不二選擇


From:http://tw.wingwit.com/Article/program/net/201311/13859.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.