131

使用 Newtonsoft.Json 操作 JSON 字符串 - 溪边静禅

 6 years ago
source link: http://www.cnblogs.com/ramantic/p/7700266.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Markdown

对 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 就可以玩各种花样了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK