如何从 C# 中的 JObject 获取特定值

How can I get specific values from JObject in 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"
            }
        }
    ]
}

如果你想让你的对象保持动态,你可以这样做

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

之后,您可以像下面这样访问里面的对象:

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

但是,我强烈建议您将 JSON 响应反序列化为定义的对象,而不是使用 dynamicdynamics 既不安全又低效。你可以做一些像下面的例子,

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;
}