正在编写C#应用程序以与我们的ServiceNow API进行通信。出于某种原因,我可以成功忽略它返回给用户的JSON文件的根令牌,而不是事件。 JSON返回似乎几乎相同,除了以下事实:一个来自事件表,另一个来自sys_user
表。
在忽略根令牌的过程中尝试了几种使用Newtonsoft的方法。这就使我知道了这段代码的位置(尽管尚未改进)
void incidentCreator(string incID)
{
var restRequest = new RestRequest(_incTableLink + "/" + incID);
restRequest.AddParameter("sysparm_display_value", "true");
restRequest.AddParameter("sysparm_fields", "assigned_to,number,sys_updated_on,sys_id,comments_and_work_notes");
string incidentJsonString = _restInteractions.querySnow(restRequest);
Incident incident = null;
try
{
incident = JObject.Parse(incidentJsonString).SelectToken("result[0]").ToObject<Incident>();
}
catch (Exception e)
{
Console.WriteLine(e);
}
_incidentList.Add(incident);
}
void userGetter(string userID)
{
var restRequest = new RestRequest(_userTableLink);
restRequest.AddParameter("sysparm_query", "sys_id=" + userID);
string userJsonString = _restInteractions.querySnow(restRequest);
User user = null;
try
{
user = JObject.Parse(userJsonString).SelectToken("result[0]").ToObject<User>();
}
catch (Exception e)
{
Console.WriteLine(e);
}
//User user = JsonConvert.DeserializeObject<User>(userJsonString);
_userList.Add(user);
}
无法处理的事件的JSON字符串
"{
\"result\": {
\"number\": \"INC1215653\",
\"sys_id\": \"52764be80007fb00903d51fea4ade50f\",
\"comments_and_work_notes\": \"2019-08-01 10: 46: 19 - PERSON (Additional comments)\\nEmailed PERSON
admin of the site to check permissions\\n",
\"sys_updated_on\": \"2019-08-01 10: 46: 17\",
\"assigned_to\": \"Employee\"
}
}"
有效的用户的JSON字符串
"{
\"result\": [
{
\"calendar_integration\": \"1\",
\"last_position_update\": \"\",
\"u_lmc_account_indicator\": \"\",
\"u_supply_chain\": \"false\",
}
]
}"
无论我使用incidentCreator()
JSON解析做什么,都使用jsonconvert或当前共享代码中存在的实现。我要么得到“对象引用未设置为对象的实例”。或只是一个变量全部为null的对象。
有什么想法吗?我为被剥离的用户json感到抱歉,这是一个巨大的字符串,在发布之前我不介意清理PII。
答案 0 :(得分:0)
第二个JSON包含一个数组。您可以在单词[
{
(数组)和result
(对象)
要针对案例user
进行解析,请尝试
JArray a = JArray.Parse(json);
var listUser = new List<User>();
foreach (JObject o in a.Children<JObject>())
{
foreach (JProperty p in o.Properties())
{
string name = p.Name;
string value = (string)p.Value;
var user = new User();
user.Name = name;
......
}
}
答案 1 :(得分:0)
您的incidentCreator
中的JPath表达式不正确。
应为:-
try { incident = JObject.Parse(incidentJsonString).SelectToken("result").ToObject<Incident>(); }
此外,这可能只是将JSON粘贴到问题中的结果,但是事件JSON示例的“ comments_and_work_notes”字段未正确转义;请确保使用短绒棉签检查您是否收到有效的JSON。
答案 2 :(得分:0)
区别在于事件的JSON字符串具有存储对象的字段result
,而用户的JSON字符串具有包含一个对象数组的字段result
事件
{
result :
{
...
}
}
用户
{
result :
[
{
...
}
]
}
所以查询SelectToken("result[0]")
将对用户有效,因为result
字段包含一个数组,该数组的元素的索引为0,但是由于该事件result
所在的字段,因此它对事件不起作用。不包含数组。
但是SelectToken("result").ToObject<Incident>()
应该给您Incident
对象。