如何从c#代码下面的结果(incident_response)中获取sys_id

时间:2017-07-20 13:48:39

标签: c# json servicenow

我有以下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"。如何检索此值?

1 个答案:

答案 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