.NET中JSON的序列化和反序列化的幾種方式

原文: .NET中JSON的序列化和反序列化的幾種方式

1、什麼是JSON

    JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式。它基於ECMAScript(歐洲計算機協會制定的js規範)的一個子集,採用徹底獨立於編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得JSON 成爲理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提高網絡傳輸效率。
    是JavaScript用來處理數據的一種格式,大部分是用來處理JavaScript和web服務器端之間的數據交換,把後臺web服務器的數據傳遞到前臺,而後使用JavaScript進行處理,例如ajax等,是獨立於語言和平臺的輕量級的數據交換格式。html

2、JSON語法

  一、JSON語法規則web

    JS 語言中,一切都是對象。所以,任何支持的類型均可以經過 JSON 來表示,例如字符串、數字、對象、數組等。可是對象和數組是比較特殊且經常使用的兩種類型:ajax

      ● 對象表示爲鍵值對編程

      ● 數據由逗號分隔json

      ● 花括號保存對象數組

      ● 方括號保存數組服務器

    對象:對象在JS中是使用花括號包裹{}起來的內容,數據結構爲{key1:value1, key2:value2, ...}的鍵值對結構。在面向對象的語言中,key爲對象的屬性,value爲對應的值。鍵名可使用整數和字符串來表示。值的類型能夠是任意類型。網絡

{"firstName": "Brett", "lastName": "McLaughlin"}
    數組:數組在JS中是方括號[]包裹起來的內容,數據結構爲[".NET", "Javascript", "Python", ...]的索引結構。在JS中,數組是一種比較特殊的數據類型,它也可 以像對象那樣使用鍵值對,但仍是索引使用得多。一樣,值的類型能夠是任意類型。
{
    "people": [{
            "firstName": "zhang",
            "lastName": "san"
        },
        {
            "firstName": "li",
            "lastName": "si"
        }
    ]
}

  二、JSON 鍵/值對數據結構

    JSON鍵值對是用來保存JS對象的一種方式,和JS對象的寫法也大同小異,鍵/值對組合中的鍵名寫在前面並用雙引號""包裹,使用冒號:分隔,而後緊接着值: {"firstName": "Json"} ,這很容易理解,等價於這條 JavaScript 語句: {firstName : "Json"} 。編程語言

  三、JSON 與 JS 對象的關係

    JS對象的關係,能夠這麼理解:JSON 是 JS 對象的字符串表示法,它使用文本表示一個 JS 對象的信息,本質是一個字符串。如:

var obj = {a: 'Hello', b: 'World'};        //這是一個對象,注意鍵名也是可使用引號包裹的
var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字符串,本質是一個字符串

  四、JSON 和 JS 對象互轉

    要實現從對象轉換爲 JSON 字符串,使用 JSON.stringify() 方法:

var json = JSON.stringify({a: 'Hello', b: 'World'}); //結果是 '{"a": "Hello", "b": "World"}'

    要實現從 JSON 轉換爲對象,使用 JSON.parse() 方法:

var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //結果是 {a: 'Hello', b: 'World'}

3、Json序列化方式

  一、JavaScriptSerializer

    使用JavaScriptSerializer方式須要引入的命名空間,這個在程序集System.Web.Extensions.dll.中。

    using System.Web.Script.Serialization;

  PS:可用[ScriptIgnore] 標記不序列化的屬性

  Code:

public ActionResult GetJsonDemo() { //對象
    DataModel model = new DataModel(); model.ID = 1; model.Name = "ZhangSan"; model.Sex = ""; model.Age = 18; //對象序列化Json
    string strJson= JsonHelper.ObjectToJson(model); //Json反序列化對象
    model= JsonHelper.JsonToObject<DataModel>(strJson); string strContent = "對象序列化:" + strJson + "\n"+
                        "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age; return Content(strContent); }

  JsonHelper:

public class JsonHelper { #region 第一種 JavaScriptSerializer  
    //使用JavaScriptSerializer方式須要引入的命名空間,這個在程序集System.Web.Extensions.dll.中 //using System.Web.Script.Serialization; //注:可用[ScriptIgnore] 標記不序列化的屬性
    /// <summary>
    /// 序列化 /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static string ObjectToJson(object obj) { JavaScriptSerializer jsonSerialize = new JavaScriptSerializer(); return jsonSerialize.Serialize(obj); } /// <summary>
    /// 反序列化 /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="strJson"></param>
    /// <returns></returns>
    public static T JsonToObject<T>(string strJson) { JavaScriptSerializer jsonSerialize = new JavaScriptSerializer(); //jsonSerialize.Deserialize<dynamic>(strJson); //取值model["Name"]; 要使用索引取值,不能使用對象.屬性
        return jsonSerialize.Deserialize<T>(strJson); } #endregion }

  Result:

  二、JSON.NET

    使用Json.NET類庫須要引入的命名空間 using Newtonsoft.Json;

  PS:可用[JsonIgnore]標記不序列化的屬性

  Code:

public ActionResult GetJsonDemo() { //對象
    DataModel model = new DataModel(); model.ID = 2; model.Name = "LiSi"; model.Sex = ""; model.Age = 20; //對象序列化Json
    string strJson = JsonHelper.ObjectToJson(model); //Json反序列化對象
    model = JsonHelper.JsonToObject<DataModel>(strJson); string strContent = "對象序列化:" + strJson + "\n" +
                        "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age; return Content(strContent); }

  JsonHelper:

/// <summary>
/// Json 幫助類 /// </summary>
public class JsonHelper { #region 第二種 JSON.NET 
    //使用Json.NET類庫須要引入的命名空間 using Newtonsoft.Json; //注:可用[JsonIgnore]標記不序列化的屬性

    /// <summary>
    /// 序列化 /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static string ObjectToJson(object obj) { return JsonConvert.SerializeObject(obj); } /// <summary>
    /// 反序列化 /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="strJson"></param>
    /// <returns></returns>
    public static T JsonToObject<T>(string strJson) { return JsonConvert.DeserializeObject<T>(strJson); } #endregion }

  Result:

  三、DataContractJsonSerializer

    使用DataContractJsonSerializer方式須要引入的命名空間,在System.Runtime.Serialization.dll.中。

    using System.Runtime.Serialization.Json;

    實體中的契約[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必需要加的,對於其餘兩種方式可加可不加。

  PS:可用[IgnoreDataMember] 標記不序列化的屬性

  Code:

public ActionResult GetJsonDemo() { //對象
    DataModel model = new DataModel(); model.ID = 3; model.Name = "Wangwu"; model.Sex = ""; model.Age = 22; //對象序列化Json
    string strJson = JsonHelper.ObjectToJson(model); //Json反序列化對象
    model = JsonHelper.JsonToObject<DataModel>(strJson); string strContent = "對象序列化:" + strJson + "\n" +
                        "反序列化值:" + model.Name + " " + model.Sex + " " + model.Age; return Content(strContent); }

  JsonHelper:

/// <summary>
/// Json 幫助類 /// </summary>
public class JsonHelper { #region 第三種 DataContractJsonSerializer
  //使用DataContractJsonSerializer方式須要引入的命名空間,在System.Runtime.Serialization.dll.中 //using System.Runtime.Serialization.Json; //注:可用[IgnoreDataMember] 標記不序列化的屬性 //實體中的契約[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必需要加的
//對於其餘兩種方式沒必要加,也能夠的。
/// <summary> /// 序列化 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static string ObjectToJson(object obj) { using (MemoryStream stream = new MemoryStream()) { DataContractJsonSerializer jsonSerialize = new DataContractJsonSerializer(obj.GetType()); jsonSerialize.WriteObject(stream, obj); return Encoding.UTF8.GetString(stream.ToArray()); } } /// <summary> /// 反序列化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="strJson"></param> /// <returns></returns> public static T JsonToObject<T>(string strJson) { using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(strJson))) { DataContractJsonSerializer jsonSerialize = new DataContractJsonSerializer(typeof(T)); return (T)jsonSerialize.ReadObject(stream); } } #endregion }

  Result:

  PS: DataModel

[DataContract] public class DataModel { [DataMember] public int ID { get; set; }
[DataMember]
public string Name { get; set; } [DataMember] public string Sex { get; set; } [DataMember] public int Age { get; set; } }

4、總結

  一、JSON序列化有三種方式

    JavaScriptSerializer類

    JSON.NET類庫

    DataContractJsonSerializer類

  二、儘可能使用JSON.NET(開源)來序列化和反序列化,性能好。

優秀是一種習慣,歡迎你們關注學習

相關文章
相關標籤/搜索