json格式的資料是javascript原生的一種資料格式,比xml更簡潔。
它有兩種形式:json物件和json物件陣列。
在此之前,有必要解釋幾個基本概念:
json字串,就是string,它一定是由雙引號包起來的,如"{'name':'jerry'}"。這是一個string,儘管去掉雙引號後它就是一個json物件。
json物件,就是以大括號開頭的物件,如{"name":"jerry"}; 而獲取name值的方式就是 json.name 或者 json["name"];
json陣列,就是以中括號開頭的json物件陣列,如[{"name":"tom"},{"name":"jerry"}];獲取值的方式是 json[0].name 或 json[0]["name"]; //這裡取第一個name
搞清楚基本概念後,理解起來就容易了。
而把符合json格式的string,轉換成json物件並提取其中值的方法,就是本文要重點介紹的。
(一):引用 newtonsoft.json.linq名稱空間
json物件
在C#中可以,利用其JObject類進行一些操作:
string json = "{'name':'terry','age':'21'}"; JObject jsonObj = JObject.Parse(json); //嘗試將字串轉換成json物件 string name = jsonObj["name"]; //在js中習慣用jsonObj.name,這裡不行 string age = jsonObj["age"]; Response.Write(name + "<br />" + age);
json陣列
類似JObject,這裡藉助JArray類:
string json = "[{'name':'tom'},{'name':'jerry'},8,10]"; JArray arr = JArray.Parse(json); //嘗試將字串轉換成json陣列 Response.Write(arr[1]["name"]); //輸出jerry
其實這個json陣列很奇怪,第三個和第四個沒有鍵值對了,就一個值,也是可以解析的:
Response.Write( arr[3] ); //輸出10
(二):引用 newtonsoft.json名稱空間
1.需要建立與json相對應的類:
public class Person { public string Name { get; set; } public int Age { get; set; } }
2.string轉物件
string json = "{'Name':'tom','Age':'21'}"; Person p = JsonConvert.DeserializeObject<Person>(json); //將字串轉換成json物件 Response.Write(p.Name); //輸出tom.這裡不能p["Name"]
3.string轉陣列
string json = "[{'Name':'a','Age':1},{'Name':'b','Age':2}]"; List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json);//用List作為容器裝Person陣列 Response.Write(persons[0].Name); //輸出a.這裡不能persons[0]["Name"]
這個把string轉換成物件或者陣列的過程,叫做反序列化。
說到反序列化,順便提一下序列化。
序列化,指把物件和陣列變為字串的過程。
例1.
Person p = new Person(){Name="jerry" , Age=23}; string json = JsonConvert.SerializeObject(p);
例2.
List<Person> persons=new List<Person>() { new Person(){ Name="a",Age=1}, new Person(){ Name="b",Age=2}, new Person(){ Name="c",Age=3}, new Person(){ Name="d",Age=4} }; string json = JsonConvert.SerializeObject(persons)
這裡不區分JArray和JObject,都是用JsonConvert.SerializeObject()方法;