對 Newtonsoft.Json 的應用可以說司空見慣,在 JSON 格式層級不深的情況下使用很方便,但有時遇到的 JSON 字符串層級非常多,且真正需要的數據往往都“埋”得很深,這時如果去定義一個與之對應的多層嵌套實體類就顯得不划算,下面通過實例來演示如何一步到位抓取到期望的數據(集)。
一、把實體類轉化為 JSON 字符串
1. 為實體類賦值
SenderFromMQSearch senderFromMQSearch = new SenderFromMQSearch();
senderFromMQSearch.StartTime = new DateTime(2017, 9, 10);
senderFromMQSearch.EndTime = new DateTime(2017, 9, 10);
senderFromMQSearch.FlowType = "DataSender";
2. 序列化
通過簡單的序列化后,可以將 C# 實體類轉換為 JSON 格式的字符串
string paramsText = JsonConvert.SerializeObject(senderFromMQSearch);
轉換后其格式類似如下:
{\"StartTime\":\"2017-09-10\", \"EndTime\":\"2017-09-10\", \"FlowType\":\"DataSender\", \"SiteNo\":\"\"}
二、提取 JSON 字符串中部分屬性的值
JSON 屬性的值有多種類型,比如 String、Array 等,通過屬性提取到對應的值時需要特別留意這些類型,從而做出正確地轉化。
比如現借助上面的查詢實體類,以及前文介紹的 Chloe.ORM 查詢到一段結果集,其形式如同這樣一段 JSON 字符串:
{
"Status": true,
"Msg": "成功",
"Data": {
"SiteData": [
{
"SiteNo": "200012",
"SiteName": "上海公司",
"Total": 100
},
{
"SiteNo": "214001",
"SiteName": "無錫分銷部",
"Total": 200
}
]
}
}
並將該字符串存儲在變量 resultText 中。
1. JObject
將其轉化為 JSON 對象,即 JObject:
JObject jObj = JObject.Parse(resultText);
接着可以嘗試獲取"Data"屬性的值:
jObj["Data"].ToString();
其值的形式為:
{
"SiteData": [
{
"SiteNo": "200012",
"SiteName": "上海公司",
"Total": 100
},
{
"SiteNo": "214001",
"SiteName": "無錫分銷部",
"Total": 200
}
]
}
2. JArray
這時發現,真正期望的值其實還在屬性“SiteData”里面,那不如索性一步到位:
jObj["Data"]["SiteData"].ToString();
此時,其值的形式為:
[
{
"SiteNo": "200012",
"SiteName": "上海公司",
"Total": 100
},
{
"SiteNo": "214001",
"SiteName": "無錫分銷部",
"Total": 200
}
]
可見這是一個數組格式的字符串,可以嘗試將其轉化為數組對象,即 JArray:
JArray siteDataArray = JArray.Parse(jObj["Data"]["SiteData"].ToString());
3. JArray 轉換為 List
對於該數組中的每一個對象,都存在三個屬性: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 就可以玩各種花樣了。