本人是C#小白,這裏摘抄並整理了兩位大神的文章:
Newtonsoft.Json筆記 -JToken、JObject、JArray詳解
Json 基於類 Newtonsoft.Json.Linq.JToken的應用簡介
簡單介紹如何使用Newtonsoft.Json類庫和操作Json對象,這裏主要介紹Linq to Json類。
Newtonsoft.Json
封裝類實現了JToken,
直接對JSON進行增刪改查的操作,很好的解決了動態解析json數據的問題,
JToken
的層次結構是這樣的:
JToken
-抽象基類
JContainer
- 能夠包含其它JToken
的JToken
抽象基類
JArray
- 表示一個JSON數組(包含一個有序的List)
JObeject
- 表示一個JSON對象(包含一個IEnumerable
)
JProperty
- 表示一個JSON屬性(在JObject
中是一個name/JToken
鍵值對)
JValue
- 表示一個原生JSON值(string,number,boolean,null
)
一,Linq to Json
使用Linq to Json前,需要引用Newtonsoft.Json的dll和using Newtonsoft.Json.Linq的命名空間。
Linq to Json主要使用到JObject, JArray, JProperty和JValue這四個對象,以及一個特殊的JToken對象。
- JObject:基本的Json對象,用來生成一個JSON對象,簡單來說就是生成”{}”,
- JArray用來生成一個JSON數組,也就是”[]”,
- JProperty用來生成一個JSON數據,格式爲key/value的值,
- 而JValue則直接生成一個JSON的Key的Value
- JToken 用於存放Linq to JSON查詢後的結果
1,創建JSON對象
JObject staff = new JObject(); staff.Add(new JProperty("Name", "Jack")); staff.Add(new JProperty("Age", 33)); staff.Add(new JProperty("Department", "Personnel Department")); staff.Add(new JProperty("Leader", new JObject(new JProperty("Name", "Tom"), new JProperty("Age", 44), new JProperty("Department", "Personnel Department")))); Console.WriteLine(staff.ToString());
還可以通過以下方法創建Json對象:
方法 | 說明 |
---|---|
JObject.Parse(string json) |
json含有JSON對象的字符串,返回爲JObject對象 |
JObject.FromObject(object o) |
o爲要轉化的對象,返回一個JObject對象 |
2,創建JSON數據
// 創建數組 JArray array = new JArray(); array.Add(new JValue("喫飯")); array.Add(new JValue("睡覺")); Console.WriteLine(array.ToString());
上面的代碼可以簡化爲:
JArray array = new JArray("喫飯", "睡覺")
3,查詢
舉一個簡單的例子:
string json = "{\"Name\" : \"Jack\", \"Age\" : 34, \"Colleagues\" : [{\"Name\" : \"Tom\" , \"Age\":44},{\"Name\" : \"Abel\",\"Age\":29}] }"; //將json轉換爲JObject JObject jObj = JObject.Parse(json); JToken ageToken = jObj["Age"]; Console.WriteLine(ageToken.ToString());
二,使用JToken操作Json對象
1,查詢
首先準備json字符串,是一個包含員工基本信息的json,並把字符串轉換爲JObject:
string json = "{\"Name\" : \"Jack\", \"Age\" : 34, \"Colleagues\" : [{\"Name\" : \"Tom\" , \"Age\":44},{\"Name\" : \"Abel\",\"Age\":29}] }"; //將json轉換爲JObject JObject jObj = JObject.Parse(json);
獲取員工的姓名:
//通過屬性名或者索引來訪問,僅僅是自己的屬性名,而不是所有的 JToken ageToken = jObj["Age"]; Console.WriteLine(ageToken.ToString());
獲取員工的同事的姓名:"Children()"可以返回所有數組中的對象
var names=from staff in jObj["Colleagues"].Children() select (string)staff["Name"]; foreach (var name in names) Console.WriteLine(name);
2,修改
//將json轉換爲JObject jObj["Age"] = 35; Console.WriteLine(jObj.ToString());
修改Jack同事的年齡爲45:
//將json轉換爲JObject JObject jObj = JObject.Parse(json); JToken colleagues = jObj["Colleagues"]; colleagues[0]["Age"] = 45; jObj["Colleagues"] = colleagues;//修改後,再賦給對象 Console.WriteLine(jObj.ToString());
3,刪除
//刪除第一個同事 JObject jObj = JObject.Parse(json); jObj["Colleagues"][1].Remove(); Console.WriteLine(jObj.ToString()); //刪除所有同事 JObject jObj = JObject.Parse(json); jObj.Remove("Colleagues");//跟的是屬性名稱 Console.WriteLine(jObj.ToString());
4,添加
//添加部門信息,必須添加在Age節點的後面 JObject jObj = JObject.Parse(json); jObj["Age"].Parent.AddAfterSelf(new JProperty("Department", "Personnel Department")); Console.WriteLine(jObj.ToString()); //添加新的同事 JObject jObj = JObject.Parse(json); JObject linda = new JObject(new JProperty("Name", "Linda"), new JProperty("Age", "23")); jObj["Colleagues"].Last.AddAfterSelf(linda); Console.WriteLine(jObj.ToString());
5,彙總
var cardJson = "['身份證','銀行卡','門禁卡']"; var cardJArray = JArray.Parse(cardJson); var p = new Person { Name="fan",Age=12,Dog=new Dog { Name="奶牛"} }; JObject jobj= JObject.FromObject(p); //添加屬性 jobj["NickName"] = "fan"; jobj["Wifes"] = new JArray("rose", "lisa"); ((JArray)jobj["Wifes"]).Add( "july"); jobj["Cards"] = cardJArray; //修改屬性 jobj["Name"] = "li"; jobj["Age"] = 9; jobj["Dog"]["Name"] = "阿黃"; ((JArray)jobj["Wifes"])[0] = "roses"; //插入屬性 jobj.Property("Name").AddBeforeSelf(new JProperty("ID", 1)); //刪除屬性 jobj.Property("Age").Remove(); ((JArray)jobj["Wifes"])[2].Remove(); //查找 //遍歷屬性 var props = jobj.Children().Values(); foreach (var prop in props) { if (!(prop is JObject) && !(prop is JArray)) { Console.WriteLine(prop.ToString()); } } //遍歷數組 var cardList = ((JArray)jobj["Cards"]); foreach (var card in cardList) { Console.WriteLine(card.ToString()); } //強類型讀取 Console.WriteLine(jobj.Value<int>("ID")); var p2 = jobj.ToString();
三,LINQ to Json各個類型的用法彙總
//JToken: 以下兩種寫法都可以被轉換爲 JToken 類型 string jtokenstring1 = "\"Hello World\""; string jtokenstring2 = "{\"name\":\"John\",\"age\":30}"; JToken jtoken1 = JToken.Parse(jtokenstring1); JToken jtoken2 = (JToken)JsonConvert.DeserializeObject(jtokenstring2); //JObject: 只能序列化標準的 json 字符串 string jobjstring2 = "{\"name\":\"John\",\"age\":30}"; JObject jobj1 = JObject.Parse(jtokenstring2); JObject jobj2 = (JObject)JsonConvert.DeserializeObject(jtokenstring2); // JArray: 以下兩種寫法都可解析,主要標識是字符串的兩端是中括號 string jarraystring1 = "[\"value1\",\"value2\"]"; string jarraystring2 = "[{\"name\":\"John\",\"age\":30},{\"name\":\"Bob\",\"age\":20}]"; JArray jarray1 = JArray.Parse(jarraystring2); JArray jarray2 = (JArray)JsonConvert.DeserializeObject(jarraystring2); // 創建一個 JProperty 的對象,然後轉成字符串值 string propertyname = "name"; string propertyvalue = "John"; JProperty jproperty = new JProperty(propertyname, propertyvalue); var jp = jproperty.ToString(); // 輸出結果:"name": "John" // 但是通過這個輸出的格式進行序列化時,就會提示異常,如下: string jpropertystring1 = "\"name\": \"John\""; // Newtonsoft.Json.JsonReaderException:Additional text encountered after finished reading JSON content var jProperty1 = JProperty.Parse(jpropertystring1); var jProperty2 = (JProperty)JsonConvert.DeserializeObject(jpropertystring1); // 下面將 jproperty 對象加入 JObject JObject jobject = new JObject(); // 將 JProperty 添加到 JObject 中 jobject.Add(jproperty); string jsonstring = jobject.ToString(); // 將 JObject 轉換爲字符串 // 輸出結果:{\r\n \"name\": \"John\"\r\n} //JValue: 用法 JObject jsonObject = JObject.Parse("{\"a\":10,\"b\":\"Hello World\",\"c\":10}"); // 獲取值信息 JValue jvaluea = (JValue)jsonObject["a"]; JValue jvalueb = (JValue)jsonObject["b"]; JValue jvaluec = (JValue)jsonObject["c"]; // JValue 兩個實例比較 Console.WriteLine("jvaluea.Equals(jvalueb): " + jvaluea.Equals(jvalueb)); // false Console.WriteLine("jvaluea.Equals(jvaluec): " + jvaluea.Equals(jvaluec)); // true Console.WriteLine("jvaluea==jvaluec: " + (jvaluea == jvaluec)); // false Console.WriteLine("jvalueb: " + jvalueb); // Hello World int intValue = jvaluea.Value<int>(); // 將值轉換爲整數類型 Console.WriteLine("Integer value: " + intValue);
四, Json格式的字符串轉換爲Json對象
// 以下是將字符串轉成三種對象的方法,寫法相同 JObject jo = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(strjson); JToken jo = (JToken)Newtonsoft.Json.JsonConvert.DeserializeObject(strjson); JArray jo = (JArray)Newtonsoft.Json.JsonConvert.DeserializeObject(strjson);
五,序列化和反序列化
序列化(Serialize)和反序列化(Deserialize)的定義:
- 序列化:把對象轉化爲可傳輸的字節序列過程稱爲序列化。
- 反序列化:把字節序列還原爲對象的過程稱爲反序列化。
可見,序列化的目的是爲了把對象進行網絡傳輸和跨平臺存儲。跨平臺存儲和網絡傳輸的方式就是網絡和IO,而目前網絡和IO支持的數據格式就是字節數組。白話文是:把數據存儲到文件中,然後其他程序讀取這個文件獲取數據。
序列化是把C#對象轉換爲Json對象,而反序列化就是把Json對象轉換爲C#對象。
public class Product { string Name; string Price decimal; string [] Sizes; } Product product = new Product(); product.Name = "Apple"; product.Price = 3.99M; product.Sizes = new string[] { "Small", "Medium", "Large" }; string output = JsonConvert.SerializeObject(product); //{ // "Name": "Apple", // "Price": 3.99, // "Sizes": ["Small", "Medium", "Large"] //} Product deserializedProduct = JsonConvert.DeserializeObject<Product>(output)
摘抄文檔,如有侵權,立馬刪除: