对于我想要的值,JSON SelectToken路径要么太高(父级)要么太低(子级)

问题描述 投票:1回答:1

我在https://sandbox.api.dell.com/support/assetinfo/v4/查询DellAPI,以获得作为.NET对象的扩展现场支持保证的结束日期。但是我无法定义我的SelectToken路径以使用戴尔的JSON结果。

这是我正在使用的相关代码(没有dellAPIKey和服务标签):

string Serial = device.dev_service_tag_serial;
var json = new WebClient().DownloadString(dellAPIPath + "getassetwarranty/" + Serial + "?apikey=" + dellAPIKey);
JObject jo = JObject.Parse(json);

foreach (JProperty x in jo.SelectToken("AssetWarrantyResponse[0].AssetEntitlementData"))
{
    JToken servicelevel = x.Value.SelectToken("ServiceLevelDescription");
    string servicelevelStr = servicelevel.ToString().ToLower();
    JToken entitlementtype = x.Value.SelectToken("EntitlementType");
    string entitlementtypeStr = entitlementtype.ToString().ToLower();

    if (servicelevelStr.Contains("onsite") && entitlementtypeStr.Contains("extended"))
    {
        JToken enddate = x.Value.SelectToken("EndDate");
        string enddateStr = enddate.ToString();
        device.dev_warranty_exp = DateTime.Parse(enddateStr);

    }

}

第一个SelectToken要么返回NULL,要么返回错误的令牌级别,具体取决于我如何更改它。

以下是我正在使用的Dell API JSON结果的一个结果(可能的敏感值替换为Ones的数字和As字母):

{{
  "AssetWarrantyResponse": [
    {
      "AssetHeaderData": {
        "BUID": "11",
        "ServiceTag": "11A11A1",
        "ShipDate": "2011-03-02T00:00:00",
        "CountryLookupCode": "US",
        "LocalChannel": "45",
        "CustomerNumber": "1111111",
        "ItemClassCode": "2N002",
        "IsDuplicate": false,
        "MachineDescription": "Latitude E6510",
        "OrderNumber": "111111111",
        "ParentServiceTag": null
      },
      "ProductHeaderData": {
        "SystemDescription": "Latitude E6510",
        "ProductId": "latitude-e6510",
        "ProductFamily": "Laptops",
        "LOB": "Latitude",
        "LOBFriendlyName": "Latitude"
      },
      "AssetEntitlementData": [
        {
          "StartDate": "2011-03-02T00:00:00",
          "EndDate": "2015-03-02T23:59:59",
          "ServiceLevelDescription": "Complete Care / Accidental Damage",
          "ServiceLevelCode": "CC",
          "ServiceLevelGroup": 11,
          "EntitlementType": "INITIAL",
          "ServiceProvider": "DELL",
          "ItemNumber": "908-5233"
        },
        {
          "StartDate": "2012-03-03T00:00:00",
          "EndDate": "2015-03-02T23:59:59",
          "ServiceLevelDescription": "ProSupport",
          "ServiceLevelCode": "TS",
          "ServiceLevelGroup": 8,
          "EntitlementType": "EXTENDED",
          "ServiceProvider": "DELL",
          "ItemNumber": "981-1533"
        },
        {
          "StartDate": "2012-03-03T00:00:00",
          "EndDate": "2015-03-02T23:59:59",
          "ServiceLevelDescription": "Onsite Service After Remote Diagnosis (Consumer Customer)/ Next Business Day Onsite After Remote Diagnosis (Commercial Customer)",
          "ServiceLevelCode": "ND",
          "ServiceLevelGroup": 5,
          "EntitlementType": "EXTENDED",
          "ServiceProvider": "QLX",
          "ItemNumber": "908-5163"
        },
        {
          "StartDate": "2011-03-02T00:00:00",
          "EndDate": "2012-03-02T23:59:59",
          "ServiceLevelDescription": "ProSupport",
          "ServiceLevelCode": "TS",
          "ServiceLevelGroup": 8,
          "EntitlementType": "INITIAL",
          "ServiceProvider": "DELL",
          "ItemNumber": "984-4000"
        },
        {
          "StartDate": "2011-03-02T00:00:00",
          "EndDate": "2012-03-02T23:59:59",
          "ServiceLevelDescription": "Onsite Service After Remote Diagnosis (Consumer Customer)/ Next Business Day Onsite After Remote Diagnosis (Commercial Customer)",
          "ServiceLevelCode": "ND",
          "ServiceLevelGroup": 5,
          "EntitlementType": "INITIAL",
          "ServiceProvider": "QLX",
          "ItemNumber": "926-2550"
        }
      ]
    }
  ],
  "InvalidFormatAssets": {
    "BadAssets": []
  },
  "InvalidBILAssets": {
    "BadAssets": []
  },
  "ExcessTags": {
    "BadAssets": []
  },
  "AdditionalInformation": null
}}

我所关心的只是AssetEntitlementData位。对于包含“onsite”的服务级别和包含“extended”的权利类型的那个,我想返回EndDate值。

任何人都可以引导我朝着正确的方向指导jo.SelectToken路径出错的地方吗?

c# .net json.net jsonpath
1个回答
0
投票

除了EndDate之外,您似乎需要了解ItemNumber,以便了解与该服务级别和日期相关的计算机。这至少有3条信息。

如果使用复杂的语法,从解析中获取数据非常简单:

var jobj = JObject.Parse(jstr);

//isolate the data group for shorter code
var jAssets = jobj["AssetWarrantyResponse"][0]["AssetEntitlementData"];  
// how many    
int assetCt = jAssets.Count();

for (int k = 0; k < assetCt; k++)
{ 
    Console.WriteLine("Item Number: {0}, End Date: {1}, Svc Lvl: {2}",
        jAssets[k]["ItemNumber"],
        DateTime.Parse(jAssets[k]["EndDate"].ToString()),
        jAssets[k]["ServiceLevelDescription"]);      
}

样本结果:

产品编号:908-5233,截止日期:2015/3/9 11:59:59,Svc Lvl:完全护理/意外损坏 项目编号:981-1533,结束日期:2015年3月7日下午11:59:59,Svc Lvl:ProSupport 项目编号:908-5163,结束日期:3/20/2015 11:59:59 PM,Svc Lvl:远程诊断后的现场服务(消费者客户)/远程诊断后的下一工作日现场(商业客户)

  • 我改变了一些日期,所以我可以肯定它正在捡起不同的日期
  • 过滤到你想要的那个(只有一个有EXTENDED和OnSite)仍然需要完成。使用NET对象和反序列化更容易。

Deserializing

给定一个代表AssetEntitlementData的类:

public class DellData
{
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public string ServiceLevelDescription { get; set; }
    public string ServiceLevelCode { get; set; }
    public int ServiceLevelGroup { get; set; }
    public string EntitlementType { get; set; }
    public string ServiceProvider { get; set; }
    public string ItemNumber { get; set; }
}

您可以解析该块并将其转换为过滤的List<DellData>

var jobj = JObject.Parse(jstr);

// deserialize and filter to just the ones you want:
List<DellData> data = JsonConvert.DeserializeObject<List<DellData>>(jAssets.ToString()).
            Where( k => (k.ServiceLevelGroup == 5) && (k.EntitlementType == "EXTENDED")).
            ToList();

请注意,这不是查找特定文本,而是查找5的ServiceLevelGroup,因此如果他们更改描述(“现场”或“现场服务排除”),您的代码不会中断。打印结果:

foreach (DellData d in data)
{
    Console.WriteLine("Item Number: {0}, End Date: {1}, Svc Grp: {2}",
        d.ItemNumber,
        d.EndDate.ToString("yyyy-MM-dd"),
        d.ServiceLevelGroup);
}

结果:

产品编号:867-5309,结束日期:2017-03-26,Svc Grp:5 产品编号:908-5163,结束日期:2015-03-20,Svc Grp:5

我添加了一个符合条件的附加项目,因为一个样本很弱。

© www.soinside.com 2019 - 2024. All rights reserved.