我在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的数字和字母代码):
{{
"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路径出错的地方吗?
答案 0 :(得分:0)
除EndDate
之外,您似乎需要了解ItemNumber
,以便了解与该服务级别和日期相关的计算机。这至少有3条信息。
如果语法错综复杂,从Parsing获取数据非常简单:
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:远程诊断后的现场服务(消费者客户)/远程诊断后的下一工作日(商业客户)
给定一个代表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();
请注意,这不是寻找特定文字,而是查找ServiceLevelGroup
为5,因此如果他们更改了说明(&#34;现场&#34;或&#34;现场服务已排除&#34 ;)你的代码没有破解。打印结果:
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
我添加了一个符合条件的附加项目,因为其中一个样本很弱。