JSON (JavaScript Object Notation,JS Object Notation)是壹種輕量級的數據交換格式。它基於ECMAScript(歐洲計算機協會制定的js規範)的子集,使用完全獨立於編程語言的文本格式來存儲和表示數據。簡單清晰的層次結構使JSON成為理想的數據交換語言。便於人們讀寫,也便於機器分析和生成,有效提高網絡傳輸效率。
它是JavaScript用來處理數據的壹種格式。大部分用來處理JavaScript和web服務器之間的數據交換,後臺web服務器的數據傳到前臺,再由JavaScript處理,比如ajax。它是壹種獨立於語言和平臺的輕量級數據交換格式。
二、JSON語法
1,JSON語法規則
在JS語言中,壹切都是對象。所以JSON可以表示任何支持的類型,比如字符串、數字、對象、數組等等。但是對象和數組是兩種特殊且常用的類型:
對象被表示為鍵值對。
數據用逗號分隔。
大括號保存對象。
方括號保存數組
Object:在JS中,object是花括號包裹的內容,數據結構是{key 1: value 1,key 2: value 2,...}.在面向對象語言中,key是對象的屬性,value是對應的值。鍵名可以用整數和字符串來表示。值的類型可以是任何類型。
{ "名字":"布雷特","姓氏":"麥克勞克林" }
Array:在JS中,array是方括號[]中包裹的內容,數據結構是["的索引結構。net”、“JavaScript”、“Python”,...].在JS中,數組是壹種特殊的數據類型,它也可以像對象壹樣使用鍵值對,但索引的使用仍然要多得多。類似地,值的類型可以是任何類型。
{
“人”:[{
“名”:“張”,
"姓氏":"三"
},
{
“名”:“李”,
"姓氏":" si "
}
]
}
2.JSON鍵/值對
JSON鍵值對是保存JSON對象的壹種方式,它們的編寫方式與JSON對象相同。鍵/值對中的鍵名寫在前面,用雙引號"",用冒號隔開:然後後面是值:{"firstName": "Json"},很好理解,等價於這個JavaScript語句:{firstName: "Json"}。
3.JSON和JS對象之間的關系
JSON對象之間的關系可以這樣理解:JSON是JSON對象的字符串表示,用文本表示壹個JS對象的信息,本質上是壹個字符串。比如:
var obj = {a:'妳好',b:'世界' };//這是壹個對象。註意,鍵名也可以用引號括起來。
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到object的轉換,使用JSON.parse()方法:
var obj = JSON.parse('{"a": "Hello "," b ":" World " } ');//結果是{a:'妳好',b:'世界' }
第三,Json序列化模式
1、JavaScript序列化程序
使用JavaScriptSerializer方法需要引入的名稱空間在程序集System.Web.Extensions.dll中。
使用系統。Web.Script .序列化;
PS:未序列化的屬性可以用[ScriptIgnore]標記。
代碼:
公共操作結果GetJsonDemo()
{
//對象
data model model = new data model();
模型。ID = 1;
模型。Name = "張三";
模型。性別= "女性";
模型。年齡= 18;
//對象序列化Json
字符串strJson= JsonHelper。ObjectToJson(模型);
//Json反序列化對象
model= JsonHelper。JsonToObject & lt數據模型& gt(str JSON);
String strContent = "對象序列化:"+strJson+"\n"+
"反序列化值:"+model . name+" "+model . sex+" "+model . age;
返回內容(str Content);
}
JsonHelper:
公共類JsonHelper
{
#region第壹個JavaScriptSerializer
//使用JavaScriptSerializer時需要引入的命名空間,它在程序集System.Web.Extensions.dll中。
//使用系統。Web.Script .序列化;
//註意:可以使用[ScriptIgnore]來標記未序列化的屬性。
///& lt;總結& gt
///序列化
///& lt;/summary & gt;
///& lt;param name = " obj " & gt& lt/param & gt;
///& lt;returns & gt& lt/returns & gt;
公共靜態字符串ObjectToJson(object obj)
{
JavaScript serializer jsonSerialize = new JavaScript serializer();
返回jsonSerialize。serialize(obj);
}
///& lt;總結& gt
///反序列化
///& lt;/summary & gt;
///& lt;typeparam name = " T " & gt& lt/type param & gt;
///& lt;param name = " strJson " & gt& lt/param & gt;
///& lt;returns & gt& lt/returns & gt;
公共靜態T JsonToObject & ltT & gt(字符串strJson)
{
JavaScript serializer jsonSerialize = new JavaScript serializer();
//jsonSerialize。反序列化& lt動態& gt(str JSON);//價值模型[" Name "];若要使用索引獲取值,不能使用對象。財產。
返回jsonSerialize。反序列化& ltT & gt(str JSON);
}
#結束區域
}
結果:
2、JSON.NET
使用Newtonsoft的命名空間。使用Json.NET類庫需要介紹的Json
PS:沒有序列化的屬性可以用【JsonIgnore】標記。
代碼:
公共操作結果GetJsonDemo()
{
//對象
data model model = new data model();
模型。ID = 2;
模型。Name = " LiSi
模型。性別= "男性";
模型。年齡= 20;
//對象序列化Json
字符串strJson = JsonHelper。ObjectToJson(模型);
//Json反序列化對象
model = JsonHelper。JsonToObject & lt數據模型& gt(str JSON);
String strContent = "對象序列化:"+strJson+"\n"+
"反序列化值:"+model . name+" "+model . sex+" "+model . age;
返回內容(str Content);
}
JsonHelper:
///& lt;總結& gt
/// Json幫助類
///& lt;/summary & gt;
公共類JsonHelper
{
#地區第二JSON.NET
//通過Newtonsoft使用命名空間。Json.NET類庫中需要引入的Json
//註意:可以使用[JsonIgnore]來標記未序列化的屬性。
///& lt;總結& gt
///序列化
///& lt;/summary & gt;
///& lt;param name = " obj " & gt& lt/param & gt;
///& lt;returns & gt& lt/returns & gt;
公共靜態字符串ObjectToJson(object obj)
{
返回JsonConvert。serialize object(obj);
}
///& lt;總結& gt
///反序列化
///& lt;/summary & gt;
///& lt;typeparam name = " T " & gt& lt/type param & gt;
///& lt;param name = " strJson " & gt& lt/param & gt;
///& lt;returns & gt& lt/returns & gt;
公共靜態T JsonToObject & ltT & gt(字符串strJson)
{
返回JsonConvert。反序列化對象& ltT & gt(str JSON);
}
#結束區域
}
結果:
3、DataContractJsonSerializer
使用DataContractJsonSerializer時需要引入的命名空間在System.Runtime.Serialization.dll。
使用系統。Runtime . Serialization.Json
必須使用DataContractJsonSerializer為序列化和反序列化添加實體中的協定[DataMember]和[DataContract],但對於其他兩種方法,可以添加或不添加它們。
PS:未序列化的屬性可以用[IgnoreDataMember]標記。
代碼:
公共操作結果GetJsonDemo()
{
//對象
data model model = new data model();
模型。ID = 3;
模型。Name = "吳王";
模型。性別= "女性";
模型。年齡= 22;
//對象序列化Json
字符串strJson = JsonHelper。ObjectToJson(模型);
//Json反序列化對象
model = JsonHelper。JsonToObject & lt數據模型& gt(str JSON);
String strContent = "對象序列化:"+strJson+"\n"+
"反序列化值:"+model . name+" "+model . sex+" "+model . age;
返回內容(str Content);
}
JsonHelper:
///& lt;總結& gt
/// Json幫助類
///& lt;/summary & gt;
公共類JsonHelper
{
#region第三個DataContractJsonSerializer
//使用DataContractJsonSerializer時需要引入的命名空間在System.Runtime.Serialization.dll。
//使用系統。Runtime . Serialization.Json
//註意:可以使用[IgnoreDataMember]來標記未序列化的屬性。
//必須使用DataContractJsonSerializer添加實體中的協定[DataMember]和[DataContract]以進行序列化和反序列化。
//對於另外兩個方法,不需要添加,但是可以做。
///& lt;總結& gt
///序列化
///& lt;/summary & gt;
///& lt;param name = " obj " & gt& lt/param & gt;
///& lt;returns & gt& lt/returns & gt;
公共靜態字符串ObjectToJson(object obj)
{
使用(memory stream stream = new memory stream())
{
DataContractJsonSerializer jsonSerialize = new DataContractJsonSerializer(obj。GetType());
jsonSerialize。WriteObject(stream,obj);
返回編碼。UTF8.GetString(流。ToArray());
}
}
///& lt;總結& gt
///反序列化
///& lt;/summary & gt;
///& lt;typeparam name = " T " & gt& lt/type param & gt;
///& lt;param name = " strJson " & gt& lt/param & gt;
///& lt;returns & gt& lt/returns & gt;
公共靜態T JsonToObject & ltT & gt(字符串strJson)
{
使用(memory stream stream = new memory stream(Encoding。UTF8.GetBytes(strJson)))
{
DataContractJsonSerializer jsonSerialize = new DataContractJsonSerializer(type of(T));
返回(T)jsonSerialize。ReadObject(流);
}
}
#結束區域
}
結果:
PS:數據模型
[數據合同]
公共類數據模型
{
[數據成員]
public int ID { get設置;}
[數據成員]
公共字符串名稱{ get設置;}
[數據成員]
公共字符串性{ get設置;}
[數據成員]
public int Age { get設置;}
}
第四,總結
序列化1和JSON有三種方法。
JavaScriptSerializer類
JSON.NET類庫
DataContractJsonSerializer類
2.嘗試使用JSON.NET(開源)進行序列化和反序列化,性能良好。