2016-11-16 583 views
0

在下面的代码中,我得到一个异常,因为JObject.Parse()中的值导致null,这当然不能被解析。在调用JObject.Parse()时处理null

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

要尝试解决此问题,我尝试了以下操作,以便在调用解析之前完成空检查。

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

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

+0

responseData [“Result”]什么值? –

+0

值为空 –

+0

所以你应该添加一个空值检查,或者使用Convert。ToString()not ToString() –

回答

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())不足以解决它,因为它只解决了这三种情况中的最后一种情况。最有可能的例外是之前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; 
0

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

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

修复它通过检查空:

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

谢谢,我仍然得到同样的错误,虽然'“错误读取从JsonReader。路径',第0行,位置0. JObject” –