如何从API返回的JSON中提取products数组并查询指定产品属性?
问题描述
我通过API调用获取到JSON数据,需要提取其中名为“products”的属性转为数组/列表,进而查找特定产品名称对应的属性值。尝试了两种方法都没成功:
- 用动态解析转成parseJson对象,但不知道怎么提取products数组:
dynamic parseJson = JsonConvert.DeserializeObject(response.Content);
- 尝试定义类反序列化,同样失败:
dynamic parseJson = JsonConvert.DeserializeObject<AccurateApiResult>(response.Content); public class AccurateApiResult { public List<AccurateProduct> products { get; set; } } public class AccurateProduct { public int id { get; set; } public string productType { get; set; } public string status { get; set; } public string result { get; set; } public bool flag { get; set; } }
示例JSON数据:
[ { "resource": "ORDER", "id": "Y10046727", "created": "2022-06-28T13:18:17Z", "updated": "2022-06-28T13:18:17Z", "workflow": "INTERACTIVE", "candidate": { "firstName": "Marcus", "lastName": "Willis", "middleName": null, "suffix": null, "dateOfBirth": "1990-01-01", "ssn": "111111111", "email": null, "phone": "240-5798551", "address": "3433 Lumar dr", "city": "Fort Washington", "region": "MD", "country": "US", "postalCode": "20744", "governmentId": { "country": "US", "type": null, "number": null }, "aliases": [], "educations": [ { "school": "Test University", "country": "US", "region": "CA", "city": "Irvine", "degree": null, "major": null, "startDate": null, "endDate": null, "graduated": false, "graduationDate": null, "presentlyEnrolled": false } ], "prevEmployed": null, "employments": [], "convicted": null, "convictions": null, "references": [], "addressHistory": [] }, "completed": "2022-07-07T01:59:13Z", "supportReferenceId": "Y10046727", "status": "COMPLETE", "result": "Meets Requirements", "products": [ { "id": 66134505, "productType": "AELS", "status": "COMPLETE", "result": "NOT APPLICABLE", "flag": false }, { "id": 66134506, "productType": "ADJ", "status": "COMPLETE", "result": "NOT APPLICABLE", "flag": false }, { "id": 66134508, "productType": "MOV", "status": "COMPLETE", "result": "Invalid SSN", "flag": false }, { "id": 66144583, "productType": "MVR", "status": "COMPLETE", "result": "NOT APPLICABLE", "flag": false }, { "id": 66144584, "productType": "F/M", "status": "COMPLETE", "result": "NO RECORD FOUND", "flag": false }, { "id": 66144587, "productType": "EDU", "status": "COMPLETE", "result": "NOT APPLICABLE", "flag": false }, { "id": 66144588, "productType": "DL5D", "status": "COMPLETE", "result": "Negative", "flag": false } ], "percentageComplete": 0, "candidateInfoChanged": false, "searchId": 66134503, "subjectId": 10121219, "requestor": "maegan@email.com" } ]
解决方案
方法1:动态解析提取products
JSON最外层是数组,动态解析后需先取数组第一个元素,再提取products:
dynamic parseJson = JsonConvert.DeserializeObject(response.Content); // 获取第一个订单对象里的products列表 var products = parseJson[0].products; // 查找特定productType的产品,例如"MOV" var targetProduct = products.FirstOrDefault(p => p.productType == "MOV"); if (targetProduct != null) { string movResult = targetProduct.result; // 得到"Invalid SSN" }
方法2:强类型反序列化(修正类定义)
之前失败的核心原因是把JSON当成单个对象处理,但实际最外层是包含一个订单对象的数组。调整类定义和反序列化方式即可:
定义类
// 对应JSON里的单个订单对象 public class Order { // 只保留需要的products属性,其他字段可忽略 public List<AccurateProduct> products { get; set; } } public class AccurateProduct { public int id { get; set; } public string productType { get; set; } public string status { get; set; } public string result { get; set; } public bool flag { get; set; } }
反序列化并提取
// 反序列化为订单列表 var orders = JsonConvert.DeserializeObject<List<Order>>(response.Content); // 取第一个订单的products var products = orders[0].products; // 查找特定产品的结果,例如"DL5D" var dl5dResult = products.FirstOrDefault(p => p.productType == "DL5D")?.result;
关键提示
- JSON最外层是
[]包裹的数组,反序列化时必须匹配这个结构,不能直接反序列化为单个对象。 - 强类型反序列化无需定义所有JSON字段,只保留你需要的属性即可,Json.NET会自动忽略未定义的字段。
内容的提问来源于stack exchange,提问作者Caverman
相关产品推荐
相关产品推荐

