Как я могу получить конкретные значения из JObject в C#

Мне нужно получить конкретные значения из ответа API. Мой ответ выглядит как один ниже. Как я могу получить доступ к значению [productCodeScheme] каждого пакета?

dynamic api = JObject.Parse(response.Content);

// api contains
{
    "operationCode": "12200000",
    "packs": [
        {
            "pack": {
                "productCodeScheme": "ppn",
                "productCode": "15000436574634",
                "serialNumber": "0000000001",
                "batchId": "00001",
                "expiryDate": "201201"
            },
            "result": {
                "operationCode": "61020008",
                "warning": "The product code is invalid."
            }
        },
        {
            "pack": {
                "productCodeScheme": "gs1",
                "productCode": "15000436574634",
                "serialNumber": "0000000002",
                "batchId": "00001",
                "expiryDate": "201201"
            },
            "result": {
                "operationCode": "11310300",
                "information": "The pack has been marked as stolen.",
                "state": "Stolen"
            }
        }
    ]
}

1 ответ

Решение

Если вы хотите, чтобы ваш объект оставался динамичным, вы можете просто сделать

dynamic result = JsonConvert.DeserializeObject<dynamic>(response.Content);

После этого вы можете получить доступ к объектам внутри, как показано ниже:

foreach(dynamic item in result.packs)
{
  string productCodeScheme = item.pack.productCodeScheme.ToString();
}

Однако я настоятельно рекомендую вам десериализовать ваши ответы JSON в определенные объекты вместо того, чтобы использовать dynamic, dynamics и небезопасны и неэффективны. Вы можете сделать что-то вроде примера ниже,

public class PackDetails
{
    public string productCodeScheme { get; set; }
    public string productCode { get; set; }
    public string serialNumber { get; set; }
    public string batchId { get; set; }
    public string expiryDate { get; set; }
}

public class Result
{
    public string operationCode { get; set; }
    public string warning { get; set; }
    public string information { get; set; }
    public string state { get; set; }
}

public class Pack
{
    public PackDetails pack { get; set; }
    public Result result { get; set; }
}

public class ResponseObject
{
    public string operationCode { get; set; }
    public List<Pack> packs { get; set; }
}

тогда вы можете десериализовать ResponseObject как ниже и использовать его

var responseObject = JsonConvert.DeserializeObject<ResponseObject>();
foreach(PackDetails item in responseObject.packs)
{
  string productCodeScheme = item.pack.productCodeScheme;
}
Другие вопросы по тегам