.NET中JSON的序列化和反序列化的幾種方式
一、什麽是JSON
JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式。它基於 ECMAScript (歐洲計算機協會制定的js規範)的一個子集,采用完全獨立於編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得JSON 成為理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網絡傳輸效率。
是JavaScript用來處理數據的一種格式,大部分是用來處理JavaScript和web服務器端之間的數據交換,把後臺web服務器的數據傳遞到前臺,然後使用JavaScript進行處理,例如ajax等,是獨立於語言和平臺的輕量級的數據交換格式。
二、JSON語法
1、JSON語法規則
JS 語言中,一切都是對象。因此,任何支持的類型都可以通過 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" } ] }
2、JSON 鍵/值對
JSON鍵值對是用來保存JS對象的一種方式,和JS對象的寫法也大同小異,鍵/值對組合中的鍵名寫在前面並用雙引號""包裹,使用冒號:分隔,然後緊接著值: {"firstName": "Json"} ,這很容易理解,等價於這條 JavaScript 語句: {firstName : "Json"} 。
3、JSON 與 JS 對象的關系
JS對象的關系,可以這麽理解:JSON 是 JS 對象的字符串表示法,它使用文本表示一個 JS 對象的信息,本質是一個字符串。如:
var obj = {a: ‘Hello‘, b: ‘World‘}; //這是一個對象,註意鍵名也是可以使用引號包裹的
var json = ‘{"a": "Hello", "b": "World"}‘; //這是一個 JSON 字符串,本質是一個字符串
4、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‘}
三、Json序列化方式
1、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:
2、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:
3、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; }
}
四、總結
1、JSON序列化有三種方式
JavaScriptSerializer類
JSON.NET類庫
DataContractJsonSerializer類
2、盡量使用JSON.NET(開源)來序列化和反序列化,性能好。
優秀是一種習慣,歡迎大家關註學習
.NET中JSON的序列化和反序列化的幾種方式