一、什么是JSON
JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數(shù)據(jù)交換格式。它基于 ECMAScript (歐洲計算機協(xié)會制定的js規(guī)范)的一個子集,采用完全獨立 于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結構使得JSON 成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升 網(wǎng)絡傳輸效率。
是JavaScript用來處理數(shù)據(jù)的一種格式,大部分是用來處理JavaScript和web服務器端之間的數(shù)據(jù)交換,把后臺web服務器的數(shù)據(jù)傳遞到前臺,然后使用JavaScript進 行處理,例如ajax等,是獨立于語言和平臺的輕量級的數(shù)據(jù)交換格式。
二、JSON語法
1、JSON語法規(guī)則
JS 語言中,一切都是對象。因此,任何支持的類型都可以通過 JSON 來表示,例如字符串、數(shù)字、對象、數(shù)組等。但是對象和數(shù)組是比較特殊且常用的兩種類型:
- 對象表示為鍵值對
- 數(shù)據(jù)由逗號分隔
- 花括號保存對象
- 方括號保存數(shù)組
對象:對象在JS中是使用花括號包裹{}起來的內容,數(shù)據(jù)結構為{key1:value1, key2:value2, ...}的鍵值對結構。在面向對象的語言中,key為對象的屬性, value為對應的值。鍵名可以使用整數(shù)和字符串來表示。值的類型可以是任意類型。
1
|
{ "firstName" : "Brett" , "lastName" : "McLaughlin" } |
數(shù)組:數(shù)組在JS中是方括號[]包裹起來的內容,數(shù)據(jù)結構為[".NET", "Javascript", "Python", ...]的索引結構。在JS中,數(shù)組是一種比較特殊的數(shù)據(jù)類型,它也可 以像對象那樣使用鍵值對,但還是索引使用得多。同樣,值的類型可以是任意類型。
1
2
3
4
5
6
7
8
9
10
11
|
{ "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 對象的信息,本質是一個字符串。如:
1
2
|
var obj = {a: 'Hello' , b: 'World' }; //這是一個對象,注意鍵名也是可以使用引號包裹的 var json = '{"a": "Hello", "b": "World"}' ; //這是一個 JSON 字符串,本質是一個字符串 |
4、JSON 和 JS 對象互轉
要實現(xiàn)從對象轉換為 JSON 字符串,使用 JSON.stringify() 方法:
1
|
var json = JSON.stringify({a: 'Hello' , b: 'World' }); //結果是 '{"a": "Hello", "b": "World"}' |
要實現(xiàn)從 JSON 轉換為對象,使用 JSON.parse() 方法:
1
|
var obj = JSON.parse( '{"a": "Hello", "b": "World"}' ); //結果是 {a: 'Hello', b: 'World'} |
三、Json序列化方式
1、JavaScriptSerializer
使用JavaScriptSerializer方式需要引入的命名空間,這個在程序集System.Web.Extensions.dll.中。
1
|
using System.Web.Script.Serialization; |
PS: 可用[ScriptIgnore] 標記不序列化的屬性
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
/// <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.中。
1
|
using System.Runtime.Serialization.Json; |
實體中的契約[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必須要加的,對于其他兩種方式可加可不加。
PS: 可用[IgnoreDataMember] 標記不序列化的屬性
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
/// <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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[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(開源)來序列化和反序列化,性能好。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/1312mn/p/9174415.html