zoukankan      html  css  js  c++  java
  • 使用 Newtonsoft.Json 操作 JSON 字符串

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

  • 相关阅读:
    Nokia Lumia 800销售反馈 苹果iPhone、三星Galaxy不敌800设计
    各大网站用户数据库被爆,遭大量网友下载
    最美发明家:GPS、手机通讯网都源自她的发明
    iPhone5或明年下半年发布 配备iOS6和A6芯片
    保存文件到手机内存
    2012年十大科技趋势:NFC、语音控制与弯曲屏
    电脑报独家报道:宽带升级全国真相调查
    Android的电话拨号器
    Java程序员成长之路(接口与抽象类究竟有什么区别)
    联系人相关
  • 原文地址:https://www.cnblogs.com/ramantic/p/7700266.html
Copyright © 2011-2022 走看看