對 Newtonsoft.Json 的應用能夠說司空見慣,在 JSON 格式層級不深的狀況下使用很方便,但有時遇到的 JSON 字符串層級很是多,且真正須要的數據每每都「埋」得很深,這時若是去定義一個與之對應的多層嵌套實體類就顯得不划算,下面經過實例來演示如何一步到位抓取到指望的數據(集)。javascript
SenderFromMQSearch senderFromMQSearch = new SenderFromMQSearch(); senderFromMQSearch.StartTime = new DateTime(2017, 9, 10); senderFromMQSearch.EndTime = new DateTime(2017, 9, 10); senderFromMQSearch.FlowType = "DataSender";
經過簡單的序列化後,能夠將 C# 實體類轉換爲 JSON 格式的字符串html
string paramsText = JsonConvert.SerializeObject(senderFromMQSearch);
轉換後其格式相似以下:java
{\"StartTime\":\"2017-09-10\", \"EndTime\":\"2017-09-10\", \"FlowType\":\"DataSender\", \"SiteNo\":\"\"}
JSON 屬性的值有多種類型,好比 String、Array 等,經過屬性提取到對應的值時須要特別留意這些類型,從而作出正確地轉化。json
好比現藉助上面的查詢實體類,以及前文介紹的 Chloe.ORM 查詢到一段結果集,其形式如同這樣一段 JSON 字符串:數組
{ "Status": true, "Msg": "成功", "Data": { "SiteData": [ { "SiteNo": "200012", "SiteName": "上海公司", "Total": 100 }, { "SiteNo": "214001", "SiteName": "無錫分銷部", "Total": 200 } ] } }
並將該字符串存儲在變量 resultText 中。code
將其轉化爲 JSON 對象,即 JObject:htm
JObject jObj = JObject.Parse(resultText);
接着能夠嘗試獲取"Data"屬性的值:對象
jObj["Data"].ToString();
其值的形式爲:blog
{ "SiteData": [ { "SiteNo": "200012", "SiteName": "上海公司", "Total": 100 }, { "SiteNo": "214001", "SiteName": "無錫分銷部", "Total": 200 } ] }
這時發現,真正指望的值其實還在屬性「SiteData」裏面,那不如索性一步到位:ip
jObj["Data"]["SiteData"].ToString();
此時,其值的形式爲:
[ { "SiteNo": "200012", "SiteName": "上海公司", "Total": 100 }, { "SiteNo": "214001", "SiteName": "無錫分銷部", "Total": 200 } ]
可見這是一個數組格式的字符串,能夠嘗試將其轉化爲數組對象,即 JArray:
JArray siteDataArray = JArray.Parse(jObj["Data"]["SiteData"].ToString());
對於該數組中的每個對象,都存在三個屬性:SiteNo、SiteName,以及 Total,爲了更方便地操做這些數據,能夠考慮泛型集合。
首先來定義實體類:
public class SiteInfo { public string SiteNo { get; set; } public string SiteName { get; set; public int Total { get; set; } }
能夠看出,實體類的屬性實際上與數組中每個對象的屬性相對應。
接着來遍歷一下這個數組,對於數組中的每個對象都會有一個實體對象(siteInfo)與之對應,而後將該實體對象(siteInfo)逐個地添加至泛型集合(siteInfoList)便可。
List<SiteInfo> siteInfoList = new List<SiteInfo>(); foreach (var item in siteDataArray) { SiteInfo siteInfo = new SiteInfo(); siteInfo.SiteNo = item["SiteNo"].ToString(); siteInfo.SiteName = item["SiteName"].ToString(); siteInfo.Total = (int)item["Total"]; siteInfoList.Add(siteInfo); }
至此,核心數據就倒騰到泛型集合中,接下來藉助 Linq 就能夠玩各類花樣了。