.NET中JSON的序列化和反序列化的幾種方式
一、什么是JSON
JSON(JavaScript Object Notation, JS 對(duì)象簡譜) 是一種輕量級(jí)的數(shù)據(jù)交換格式。它基于 ECMAScript (歐洲計(jì)算機(jī)協(xié)會(huì)制定的js規(guī)范)的一個(gè)子集,采用完全獨(dú)立 于編程語言的文本格式來存儲(chǔ)和表示數(shù)據(jù)。簡潔和清晰的層次結(jié)構(gòu)使得JSON 成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成,并有效地提升 網(wǎng)絡(luò)傳輸效率。
是JavaScript用來處理數(shù)據(jù)的一種格式,大部分是用來處理JavaScript和web服務(wù)器端之間的數(shù)據(jù)交換,把后臺(tái)web服務(wù)器的數(shù)據(jù)傳遞到前臺(tái),然后使用JavaScript進(jìn) 行處理,例如ajax等,是獨(dú)立于語言和平臺(tái)的輕量級(jí)的數(shù)據(jù)交換格式。
二、JSON語法
1、JSON語法規(guī)則
JS 語言中,一切都是對(duì)象。因此,任何支持的類型都可以通過 JSON 來表示,例如字符串、數(shù)字、對(duì)象、數(shù)組等。但是對(duì)象和數(shù)組是比較特殊且常用的兩種類型:
- 對(duì)象表示為鍵值對(duì)
- 數(shù)據(jù)由逗號(hào)分隔
- 花括號(hào)保存對(duì)象
- 方括號(hào)保存數(shù)組
對(duì)象:對(duì)象在JS中是使用花括號(hào)包裹{}起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為{key1:value1, key2:value2, ...}的鍵值對(duì)結(jié)構(gòu)。在面向?qū)ο蟮恼Z言中,key為對(duì)象的屬性, value為對(duì)應(yīng)的值。鍵名可以使用整數(shù)和字符串來表示。值的類型可以是任意類型。
{"firstName": "Brett", "lastName": "McLaughlin"}
數(shù)組:數(shù)組在JS中是方括號(hào)[]包裹起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為[".NET", "Javascript", "Python", ...]的索引結(jié)構(gòu)。在JS中,數(shù)組是一種比較特殊的數(shù)據(jù)類型,它也可 以像對(duì)象那樣使用鍵值對(duì),但還是索引使用得多。同樣,值的類型可以是任意類型。
{
"people": [{
"firstName": "zhang",
"lastName": "san"
},
{
"firstName": "li",
"lastName": "si"
}
]
}
2、JSON 鍵/值對(duì)
JSON鍵值對(duì)是用來保存JS對(duì)象的一種方式,和JS對(duì)象的寫法也大同小異,鍵/值對(duì)組合中的鍵名寫在前面并用雙引號(hào)""包裹,使用冒號(hào):分隔,然后緊接著值: { " firstName " : " Json " } , 這很容易理解,等價(jià)于這條 JavaScript 語句: {firstName : " Json " } 。
3、JSON 與 JS 對(duì)象的關(guān)系
JS對(duì)象的關(guān)系,可以這么理解:JSON 是 JS 對(duì)象的字符串表示法,它使用文本表示一個(gè) JS 對(duì)象的信息,本質(zhì)是一個(gè)字符串。如:
var obj = {a: 'Hello', b: 'World'}; //這是一個(gè)對(duì)象,注意鍵名也是可以使用引號(hào)包裹的
var json = '{"a": "Hello", "b": "World"}'; //這是一個(gè) JSON 字符串,本質(zhì)是一個(gè)字符串
4、JSON 和 JS 對(duì)象互轉(zhuǎn)
要實(shí)現(xiàn)從對(duì)象轉(zhuǎn)換為 JSON 字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'}); //結(jié)果是 '{"a": "Hello", "b": "World"}'
要實(shí)現(xiàn)從 JSON 轉(zhuǎn)換為對(duì)象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //結(jié)果是 {a: 'Hello', b: 'World'}
三、Json序列化方式
1、JavaScriptSerializer
使用JavaScriptSerializer方式需要引入的命名空間,這個(gè)在程序集System.Web.Extensions.dll.中。
using System.Web.Script.Serialization;
PS: 可用[ScriptIgnore] 標(biāo)記不序列化的屬性
Code:
public ActionResult GetJsonDemo()
{
//對(duì)象
DataModel model = new DataModel();
model.ID = 1;
model.Name = "ZhangSan";
model.Sex = "女";
model.Age = 18;
//對(duì)象序列化Json
string strJson= JsonHelper.ObjectToJson(model);
//Json反序列化對(duì)象
model= JsonHelper.JsonToObject<DataModel>(strJson);
string strContent = "對(duì)象序列化:" + strJson + "\n"+
"反序列化值:" + model.Name + " " + model.Sex + " " + model.Age;
return Content(strContent);
}
JsonHelper:
public class JsonHelper
{
#region 第一種 JavaScriptSerializer
//使用JavaScriptSerializer方式需要引入的命名空間,這個(gè)在程序集System.Web.Extensions.dll.中
//using System.Web.Script.Serialization;
//注:可用[ScriptIgnore] 標(biāo)記不序列化的屬性
/// <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"]; 要使用索引取值,不能使用對(duì)象.屬性
return jsonSerialize.Deserialize<T>(strJson);
}
#endregion
}
Result:

2、JSON.NET
使用Json.NET類庫需要引入的命名空間 using Newtonsoft.Json;
PS: 可用[JsonIgnore]標(biāo)記不序列化的屬性
Code:
public ActionResult GetJsonDemo()
{
//對(duì)象
DataModel model = new DataModel();
model.ID = 2;
model.Name = "LiSi";
model.Sex = "男";
model.Age = 20;
//對(duì)象序列化Json
string strJson = JsonHelper.ObjectToJson(model);
//Json反序列化對(duì)象
model = JsonHelper.JsonToObject<DataModel>(strJson);
string strContent = "對(duì)象序列化:" + 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]標(biāo)記不序列化的屬性
/// <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;
實(shí)體中的契約[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必須要加的,對(duì)于其他兩種方式可加可不加。
PS: 可用[IgnoreDataMember] 標(biāo)記不序列化的屬性
Code:
public ActionResult GetJsonDemo()
{
//對(duì)象
DataModel model = new DataModel();
model.ID = 3;
model.Name = "Wangwu";
model.Sex = "女";
model.Age = 22;
//對(duì)象序列化Json
string strJson = JsonHelper.ObjectToJson(model);
//Json反序列化對(duì)象
model = JsonHelper.JsonToObject<DataModel>(strJson);
string strContent = "對(duì)象序列化:" + 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] 標(biāo)記不序列化的屬性
//實(shí)體中的契約[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必須要加的
//對(duì)于其他兩種方式不必加,也可以的。
/// <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; }
}
四、總結(jié)
1、JSON序列化有三種方式
- JavaScriptSerializer類
- JSON.NET類庫
- DataContractJsonSerializer類
2、盡量使用JSON.NET(開源)來序列化和反序列化,性能好。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
silverlight用webclient大文件上傳的實(shí)例代碼
這篇文章介紹了silverlight用webclient大文件上傳的實(shí)例代碼,有需要的朋友可以參考一下2013-10-10
linq to sql中,如何解決多條件查詢問題,答案,用表達(dá)式樹!
有個(gè)小項(xiàng)目中,用到了linq to sql,既然這樣,想必需要做多條件組合查詢了,雖然我對(duì)表達(dá)式樹的研究也只是寥寥地,但除此方法,似乎別無他法,只好硬著頭皮研究一下.2011-08-08
基于.Net實(shí)現(xiàn)前端對(duì)話框和消息框
這篇文章主要介紹了基于.Net實(shí)現(xiàn)前端對(duì)話框和消息框的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
asp.net結(jié)合aspnetpager使用SQL2005的存儲(chǔ)過程分頁
項(xiàng)目中用到了,同事阿春寫了例子,并在實(shí)際項(xiàng)目中使用了,記錄下。感謝春哥的無私奉獻(xiàn)。2009-07-07
通過剪貼板實(shí)現(xiàn)將DataGridView中的數(shù)據(jù)導(dǎo)出到Excel
這篇文章主要介紹了如何通過剪貼板實(shí)現(xiàn)將DataGridView中的數(shù)據(jù)導(dǎo)出到Excel,需要的朋友可以參考下2014-05-05
ASP.NET數(shù)據(jù)庫編程之處理文件訪問許可
ASP.NET數(shù)據(jù)庫編程之處理文件訪問許可...2006-09-09

