Json to JObject轉換的使用方法

来源:http://www.cnblogs.com/klsw/archive/2016/09/25/5904573.html
-Advertisement-
Play Games

Linq to JSON是用來操作JSON對象的.可以用於快速查詢,修改和創建JSON對象.當JSON對象內容比較複雜,而我們僅僅需要其中的一小部分數據時,可以考慮使用Linq to JSON來讀取和修改部分的數據而非反序列化全部. 二.創建JSON數組和對象 在進行Linq to JSON之前,首 ...


Linq to JSON是用來操作JSON對象的.可以用於快速查詢,修改和創建JSON對象.當JSON對象內容比較複雜,而我們僅僅需要其中的一小部分數據時,可以考慮使用Linq to JSON來讀取和修改部分的數據而非反序列化全部.

二.創建JSON數組和對象

在進行Linq to JSON之前,首先要瞭解一下用於操作Linq to JSON的類.

類名 說明
JObject
 用於操作JSON對象
JArray
 用語操作JSON數組
JValue
 表示數組中的值
JProperty
 表示對象中的屬性,以"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());
複製代碼

結果:

除此之外,還可以通過一下方式來獲取JObject.JArray類似。

方法   說明
JObject.Parse(string json)
json含有JSON對象的字元串,返回為JObject對象
JObject.FromObject(object o)

o為要轉化的對象,返回一個JObject對象

JObject.Load(JsonReader reader)
reader包含著JSON對象的內容,返回一個JObject對象

 

 

 

 

 

 

2.創建JSON數組

複製代碼
            JArray arr = new JArray();
            arr.Add(new JValue(1));
            arr.Add(new JValue(2));
            arr.Add(new JValue(3));
            Console.WriteLine(arr.ToString());
複製代碼

結果:

三.使用Linq to JSON

1.查詢
首先準備Json字元串,是一個包含員工基本信息的Json

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());
複製代碼

結果:

②獲取該員工同事的所有姓名

複製代碼
            //將json轉換為JObject
            JObject jObj = JObject.Parse(json);
            var names=from staff in jObj["Colleagues"].Children()
                             select (string)staff["Name"];
            foreach (var name in names)
                Console.WriteLine(name);
複製代碼

"Children()"可以返回所有數組中的對象

結果:

2.修改

①現在我們發現獲取的json字元串中Jack的年齡應該為35

            //將json轉換為JObject
            JObject jObj = JObject.Parse(json);
            jObj["Age"] = 35;
            Console.WriteLine(jObj.ToString());

結果:

註意不要通過以下方式來修改:

            JObject jObj = JObject.Parse(json);
            JToken age = jObj["Age"];
            age = 35;

②現在我們發現Jack的同事Tom的年齡錯了,應該為45

複製代碼
            //將json轉換為JObject
            JObject jObj = JObject.Parse(json);
            JToken colleagues = jObj["Colleagues"];
            colleagues[0]["Age"] = 45;
            jObj["Colleagues"] = colleagues;//修改後,再賦給對象
            Console.WriteLine(jObj.ToString());
複製代碼

結果:

3.刪除
①現在我們想刪除Jack的同事

            JObject jObj = JObject.Parse(json);
            jObj.Remove("Colleagues");//跟的是屬性名稱
            Console.WriteLine(jObj.ToString());

結果:

②現在我們發現Abel不是Jack的同事,要求從中刪除

            JObject jObj = JObject.Parse(json);
            jObj["Colleagues"][1].Remove();
            Console.WriteLine(jObj.ToString());

結果:

4.添加
①我們發現Jack的信息中少了部門信息,要求我們必須添加在Age的後面

            //將json轉換為JObject
            JObject jObj = JObject.Parse(json);
            jObj["Age"].Parent.AddAfterSelf(new JProperty("Department", "Personnel Department"));
            Console.WriteLine(jObj.ToString());

結果:

②現在我們又發現,Jack公司來了一個新同事Linda

            //將json轉換為JObject
            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());

結果:

四.簡化查詢語句

使用函數SelectToken可以簡化查詢語句,具體:
①利用SelectToken來查詢名稱

            JObject jObj = JObject.Parse(json);
            JToken name = jObj.SelectToken("Name");
            Console.WriteLine(name.ToString());

結果:

②利用SelectToken來查詢所有同事的名字

            JObject jObj = JObject.Parse(json);
            var names = jObj.SelectToken("Colleagues").Select(p => p["Name"]).ToList();
            foreach (var name in names)
                Console.WriteLine(name.ToString());

結果:

③查詢最後一名同事的年齡

            //將json轉換為JObject
            JObject jObj = JObject.Parse(json);
            var age = jObj.SelectToken("Colleagues[1].Age");
            Console.WriteLine(age.ToString());

結果:

 

FAQ

1.如果Json中的Key是變化的但是結構不變,如何獲取所要的內容?

例如: 複製代碼
 1 {
 2 "trends":
 3 {
 4 "2013-05-31 14:31":
 5 [
 6 {"name":"我不是誰的偶像",
 7 "query":"我不是誰的偶像",
 8 "amount":"65172",
 9 "delta":"1596"},
10 {"name":"世界無煙日","query":"世界無煙日","amount":"33548","delta":"1105"},
11 {"name":"最萌身高差","query":"最萌身高差","amount":"32089","delta":"1069"},
12 {"name":"中國合伙人","query":"中國合伙人","amount":"25634","delta":"2"},
13 {"name":"exo回歸","query":"exo回歸","amount":"23275","delta":"321"},
14 {"name":"新一吻定情","query":"新一吻定情","amount":"21506","delta":"283"},
15 {"name":"進擊的巨人","query":"進擊的巨人","amount":"20358","delta":"46"},
16 {"name":"誰的青春沒缺失","query":"誰的青春沒缺失","amount":"17441","delta":"581"},
17 {"name":"我愛幸運七","query":"我愛幸運七","amount":"15051","delta":"255"},
18 {"name":"母愛10平方","query":"母愛10平方","amount":"14027","delta":"453"}
19 ]
20 },
21 "as_of":1369981898
22 }
複製代碼

其中的"2013-05-31 14:31"是變化的key,如何獲取其中的"name","query","amount","delta"等信息呢?
通過Linq可以很簡單地做到:

複製代碼
 var jObj = JObject.Parse(jsonString);
            var tends = from c in jObj.First.First.First.First.Children()
                        select JsonConvert.DeserializeObject<Trend>(c.ToString());
public class Trend
{
            public string Name { get; set; }
            public string Query { get; set; }
            public string Amount { get; set; }
            public string Delta { get; set; }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 設計表格我覺得用PowerDesigner比起在SQL Server中設計表格簡單快捷許多。 首先,我們新建一個Model(可以使用快捷鍵Ctrl + N) 在PowerDesigner中側邊欄有浮動小工具欄: 這都是我們設計的工具,然後點擊表格Columns設計表格: 之後就設計表格就可以了。 就 ...
  • 1.背景說明: vim編輯器是linux一款非常流行功能強大的文本編輯。配置好vim可大大提高代碼的開發效率 2.配置方案: 我在github搜索了別人是如何進行vim配置的,在這裡你可以選擇一款適合你的配置方案,這裡我選擇Star比較多的配置方案:vimrc 3.如何安裝: 參考上述鏈接,安裝說明 ...
  • 有時候因為斷電或者其他原因導致伺服器關機,這在測試伺服器上面是很常見的事情。而伺服器上面的多個進程也就關閉了,每次都要去重啟很麻煩,於是就查了一下設置開機自動啟動的方法,這樣開機就只用稍微看看服務是否啟動就好了,不用一個一個去啟動了。 ...
  • 一、POST加電自檢 按下電源後ROM晶元中的CMOS程式執行並檢測CPU、記憶體等設備是否存在並正常運行,CMOS中的程式叫BIOS,可以設置硬碟介面,網卡音效卡開關之類的簡單設置。一般PC機主板上有一個紐扣電池,這個電池就是給ROM供電的,可以保證主板斷電後BIOS的一些基本設置不會重置。 下麵是一 ...
  • 我們知道,迄今為止,Ubuntu已有多個發行版,如11.04、11.10,以至於現在最新的16. 。而我們平常通過apt get來安裝軟體,如果OS版本不同,那麼鏡像源的配置就不同,否則就會出現找不到對應軟體、軟體版本不匹配等一系列奇怪的問題。這裡,我就講述一下如何配置不同的版本的鏡像源。在此,我就 ...
  • 1.編譯器gcc的語法順序 PC: gcc -o ana *.o ${LIBS} 輸出可執行文件名 各種目標文件 要鏈接的庫 交叉編譯:arm-linux-gcc ${LIBS] *.o -o ana 2.Minigui.config 將/usr/local/etc/MiniGUI.cfg 與 ./ ...
  • 關於《rsyslog+mysql+loganalyzer搭建日誌伺服器<個人筆記>》的反思--鏈接--http://www.cnblogs.com/drgcaosheng/p/5832697.html 之前使用這個搭建了一個日誌伺服器,但是在mysql中,日誌增加太快,過了些天,已經有幾千萬的數據了 ...
  • 0 Asp.Net Core 項目實戰之許可權管理系統(0) 無中生有 1 Asp.Net Core 項目實戰之許可權管理系統(1) 使用AdminLTE搭建前端 2 Asp.Net Core 項目實戰之許可權管理系統(2) 功能及實體設計 3 Asp.Net Core 項目實戰之許可權管理系統(3) 通過 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...