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