You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从API返回的JSON中提取products数组并查询指定产品属性?

问题描述

我通过API调用获取到JSON数据,需要提取其中名为“products”的属性转为数组/列表,进而查找特定产品名称对应的属性值。尝试了两种方法都没成功:

  1. 用动态解析转成parseJson对象,但不知道怎么提取products数组:
dynamic parseJson = JsonConvert.DeserializeObject(response.Content);
  1. 尝试定义类反序列化,同样失败:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 14:45:41