我有以下JSON(已修改),它是从HttpWebRequest
响应流中读取的,我想提取"sys_id"
的值:
{
"result": {
"number": "INC0012618",
"opened_by": {
"link": "//XXX.service-now.com/api/now/v1/table/sys_user/38723e5ddb42f200deb8f6fcbf96196d",
"value": "38723e5ddb42f200deb8f6fcbf96196d"
},
"sys_created_on": "2017-07-20 14:41:52",
"sys_domain": {
"link": "://XXX.service-now.com/api/now/v1/table/sys_user_group/global",
"value": "global"
},
"u_incident_summary": "",
"business_service": {
"link": "://xxx.service-now.com/api/now/v1/table/cmdb_ci_service/IT services",
"value": "IT services"
},
"work_end": "",
"caller_id": {
"link": "://xxxx.service-now.com/api/now/v1/table/sys_user/71f5455d4f735e000d7f0ed11310c719",
"value": "71f5455d4f735e000d7f0ed11310c719"
},
"close_code": "",
"assignment_group": {
"link": "://xxx.service-now.com/api/now/v1/table/sys_user_group/9e158987dba27a007ea0f4e9bf961983",
"value": "9e158987dba27a007ea0f4e9bf961983"
},
"sys_id": "7fb4e50edb8c0b007ea0f4e9bf9619ba",
"u_outage_start_time": ""
}
}
这是我到目前为止所尝试过的,其中incident_responce
是一个包含上述JSON的字符串:
var jObject = JObject.Parse(incident_responce);
var value = (string)jObject["sys_id"];
Console.WriteLine(value);
但是,它没有用,我想因为一开始就有"result"
。如何检索此值?
答案 0 :(得分:0)
如您所料,您的初始尝试失败,因为"sys_id"
嵌套在"result"
对象中:
{ "result": { ... "sys_id":"7fb4e50edb8c0b007ea0f4e9bf9619ba" } }
如果您缩进并格式化JSON,可以更容易看到这一点,例如将其上传到https://jsonformatter.curiousconcept.com/。
可以使用JToken.SelectToken()
:
var root = JToken.Parse(incident_responce);
var value = (string)root.SelectToken("result.sys_id");
SelectToken()
支持使用JSONPath syntax查询JSON容器层次结构中的值。如果找不到"result.sys_id"
令牌,则会返回null
。
或者,您可以使用Json.NET支持使用dynamic functionality查询JSON层次结构:
dynamic root = JToken.Parse(incident_responce);
var value = (string)root.result.sys_id;
但是,如果找不到"result"
令牌,则会抛出RuntimeBinderException
而不是返回null
值。
工作.Net fiddle。