Newtonsoft.Json 入門介紹

本人是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     - 能夠包含其它JTokenJToken抽象基類
    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)

 

摘抄文檔,如有侵權,立馬刪除:

Newtonsoft.Json筆記 -JToken、JObject、JArray詳解

Json 基於類 Newtonsoft.Json.Linq.JToken的應用簡介

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章