我正在尝试从为winforms设计的github转换一段代码但是我遇到以下错误。
//Retrieve and set a post code value to a variable.
var mPostCode = txtPostCode.Text;
mApiKey = "";
string url =
String.Format("http://pcls1.craftyclicks.co.uk/json/basicaddress?postcode={0}&response=data_formatted&key={1}",
mPostCode, mApiKey);
//Complete XML HTTP Request
WebRequest request = WebRequest.Create(url);
//Complete XML HTTP Response
WebResponse response = request.GetResponse();
//Declare and set a stream reader to read the returned XML
StreamReader reader = new StreamReader(response.GetResponseStream());
// Get the requests json object and convert it to in memory dynamic
// Note: that you are able to convert to a specific object if required.
var jsonResponseObject = JsonConvert.DeserializeObject<dynamic>(reader.ReadToEnd());
// check that there are delivery points
if (jsonResponseObject.thoroughfare_count > 0)
{
//If the node list contains address nodes then move on.
int i = 0;
foreach (var node in jsonResponseObject.delivery_points)
{
ClsAddress address = new ClsAddress()
{
AddressID = i,
AddressLine1 = node.line_1,
AddressLine2 = node.line_2,
County = jsonResponseObject.postal_county,
PostCode = jsonResponseObject.postcode,
Town = jsonResponseObject.town
};
addressList.Add(address);
i++;
}
this.LoadAddressListIntoDropDown();
}
错误在于这条线 //检查是否有送货点 if(jsonResponseObject.thoroughfare_count&gt; 0)
错误是
对象引用未设置为对象的实例。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。
来源错误:
Line 148: //If the node list contains address nodes then move on.
Line 149: int i = 0;
Line 150: foreach (var node in jsonResponseObject.delivery_points)
Line 151: {
Line 152: ClsAddress address = new ClsAddress()
现在我知道这通常是一个对象没有被引用但是不是var节点的作用吗?
非常感谢任何帮助。我为了安全起见编辑了我的api密钥,但确实过时了。
答案 0 :(得分:0)
var
关键字告诉编译器从语句的其余部分推断变量的类型。在这种情况下,推断类型将为dynamic
,因为您尝试使用JsonConvert.DeserializeObject<dynamic>
反序列化流。但这并不能保证变量的值不会为空!实际上,如果您的响应流没有数据,那么JsonConvert.DeserializeObject
肯定会返回null。因此,如果您尝试引用一个null对象的属性,它将抛出一个异常,这似乎正是这里发生的事情。
我的猜测是,您从服务器返回某种错误,而不是您期望的响应。您的代码不会检查我可以看到的HTTP错误;它只是盲目地尝试处理响应,假设它是成功的。您应该使用像Fiddler这样的Web调试代理来查找您实际从服务器获取的内容。然后,您应该使用适当的错误处理和空检查来增强代码。有关详细信息,请参阅What is a NullReferenceException, and how do I fix it?。