首页 > 解决方案 > 通过 JSON 标签读取 JSON

问题描述

我从身份检查公司以 JSON 的形式获取数据。我只需要从该 JSON 文件中获取一些数据,因此我反序列化 JSON 文件并尝试读取特定标签。当我试图读取标签时,我总是得到空值。下面是我的 JSON 文件和 C# 代码:

{
    "responseHeader": {
        "requestType": "PreciseIdOnly",
        "clientReferenceId": "21321",
        "expRequestId": "213213",
        "messageTime": "2020-05-28T00:00:02Z",
        "overallResponse": {
            "decision": "REFER",
            "decisionText": "Continue & Investigate",
            "decisionReasons": [
                "Continue & Investigate"
            ],
            "recommendedNextActions": [],
            "spareObjects": []
        },
        "responseCode": "R123",
        "responseType": "INFO",
        "responseMessage": "Workflow Complete.",
        "tenantID": "V123242"
    },
    "clientResponsePayload": {
        "orchestrationDecisions": [
            {
                "sequenceId": "1",
                "decisionSource": "PreciseId",
                "decision": "REFER",
                "decisionReasons": [
                    "Continue & Investigate"
                ],
                "score": 737,
                "decisionText": "Continue & Investigate",
                "nextAction": "Continue",
                "appReference": "22222",
                "decisionTime": "2020-05-28T18:58:43Z"
            }
        ]
    }
}

下面是我的代码:

 var data = (JObject)JsonConvert.DeserializeObject(JSONResponse);
 string x = data["clientResponsePayload.orchestrationDecisions.sequenceId"].Value<string>();

JSONResponse 是我来自检查身份的公司的 JSON 文件。我收到一条错误消息:

"Value cannot be null.\r\nParameter name: value

我不确定我做错了什么。这个 JSON 文件很大并且有很多嵌套的 JSON 标签。这就是我阅读身份检查公司发送给我的 JSON 文件的方式:

HttpResponseMessage response = client.SendAsync(request).Result;
string responseContent = await response.Content.ReadAsStringAsync();

标签: c#jsonjson.net

解决方案


你有几个问题。

首先,"clientResponsePayload.orchestrationDecisions.sequenceId"是一个JSONPath 查询。要JObject通过 JSONPath 查询查询,您需要使用JToken.SelectToken(). 您使用的索引器仅使用指定的属性名称获取或设置 ,JToken而不执行 JSON 层次结构的深度查询。

其次,该sequenceId属性实际上嵌套在一个数组中,因此需要使用路径"clientResponsePayload.orchestrationDecisions[0].sequenceId"来获取第一个。或者,或者,您可以使用带有*通配符的路径"clientResponsePayload.orchestrationDecisions[*].sequenceId"以及JToken.SelectTokens()获取所有序列 ID。

因此,您的代码应该是:

var x = data.SelectToken("clientResponsePayload.orchestrationDecisions[0].sequenceId")?.Value<string>();

或者,您可以使用空条件运算符?[]将索引器链接在一起,而不是使用 JSONPath 查询,如下所示:

var x = data["clientResponsePayload"]?["orchestrationDecisions"]?[0]?["sequenceId"]?.Value<string>();

演示小提琴在这里


推荐阅读