c# - 通过 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();
解决方案
你有几个问题。
首先,"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>();
演示小提琴在这里。
推荐阅读
- swift - 试图追查为什么我将 Nil 数据从一个视图返回到另一个视图
- c++ - 缺少终止字符
- reactjs - npm包中antd的使用
- azure-blob-storage - Azure Blob:如果目标容器中的虚拟目录路径不完全匹配,则 StartCopyAsync 失败
- python - 如何优雅地在python中串行(或区分)函数参数或串行函数调用结果?
- c - 当目标值等于程序中的 res 值时,如何终止程序?
- android - 如何从 UmmalquraCalendar 单击按钮获取下一个和上一个日期?
- javascript - 云消息传递在 react-native-firebase v6.xx 中如何工作?
- laravel - 作曲家版本要求
- python - 包装python字典或设置到新行