在调用JObject.Parse()时处理null



在下面的代码中,我得到一个异常,由于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);

这仍然会导致一个异常,我觉得我只是忽略了一些非常小的东西。

JObject result = JObject.Parse(responseData["Result"].ToString());可能由于以下几个原因抛出异常:

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

仅仅检查string.IsNullOrEmpty(responseData["Result"].ToString())是不足以修复它的,因为它只解决了这三种情况中的最后一种。最有可能的异常是在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;

这与JObject.Parse无关-我怀疑它将通过返回null或空JObject来处理null。

最有可能的是你错过了responseData["Result"]是空的,你试图在它上面调用ToString()。这将导致NullReferenceException

通过检查null来修复:

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

相关内容

  • 没有找到相关文章

最新更新