调用JObject.Parse()时处理null

时间:2016-11-16 16:20:02

标签: c# .net json json.net

在下面的代码中,由于JObject.Parse()中的值导致null而导致异常,因此无法解析。

JObject result = JObject.Parse(responseData["Result"].ToString());

为了尝试解决这个问题,我尝试了以下操作,以便在调用parse之前完成空检查。

var resultString = string.IsNullOrEmpty(responseData["Result"].ToString()) ? "" : responseData["Result"].ToString();
JObject result = JObject.Parse(resultString);

这仍然会导致异常,我觉得我只是在这里忽略了一些非常小的东西。我该怎么做才能解决可能的空值。

2 个答案:

答案 0 :(得分:1)

由于以下几个原因,

JObject result = JObject.Parse(responseData["Result"].ToString());可能会抛出异常:

  • 如果responseData本身为null,则尝试访问responseData["Result"]将引发异常。
  • 如果responseData["Result"]为空(例如,如果responseData中没有名为“结果”的键),则尝试访问responseData["Result"].ToString()将引发异常。
  • 如果responseData["Result"].ToString()为空(或为空),则JObject.Parse()将抛出,因为null不是有效的JSON字符串。

仅仅检查string.IsNullOrEmpty(responseData["Result"].ToString())并不足以解决问题,因为它只解决了这三种情况中的最后一种情况。很可能在<{em> ToString()调用之前抛出了异常,并且您只检查ToString()结果是否为空。到那时为时已晚。

当你遇到这样的情况,你有一个复杂的代码行,并且它在其中的某个地方抛出异常时,它有助于将其分解并在每一步执行空检查。通过这种方式,您可以轻松地使用调试器,并确切了解正在发生的事情。

JObject result = null;
if (responseData != null)
{
    object obj = responseData["Result"];
    if (obj != null)
    {
        string str = obj.ToString();
        if (!string.IsNullOrEmpty(str))
        {
            result = JObject.Parse(str);
        }
    }
}

说了这么多之后,我想指出你的代码似乎比你需要的代码更复杂。您没有在问题中说responseData是什么,但根据您使用它的方式,我猜它是JObject。如果确实如此,则您不需要将responseData["result"]转换为字符串,然后将其重新解析为JObject。相反,你需要做的就是施展它:

JObject result = responseData != null ? responseData["Result"] as JObject : null;

答案 1 :(得分:0)

这与JObject.Parse无关 - 我怀疑只会返回一个null或空的JObject来处理null。

最有可能的是你;错过responseData["Result"]为空,并且您正试图在其上调用ToString()。这将导致NullReferenceException

通过检查null来修复它:

var resultString = (responseData["Result"] == null || string.IsNullOrEmpty(responseData["Result"].ToString())) 
    ? "" 
    : responseData["Result"].ToString();