两个几乎完全相同的功能,一个起作用,另一个不起作用?

时间:2019-08-08 08:20:38

标签: c# json parsing json.net restsharp

正在编写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。

3 个答案:

答案 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对象。