在json响应对象中调用web api错误

时间:2017-04-20 20:55:40

标签: c# json webforms json.net

我正在尝试从为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密钥,但确实过时了。

1 个答案:

答案 0 :(得分:0)

var关键字告诉编译器从语句的其余部分推断变量的类型。在这种情况下,推断类型将为dynamic,因为您尝试使用JsonConvert.DeserializeObject<dynamic>反序列化流。但这并不能保证变量的值不会为空!实际上,如果您的响应流没有数据,那么JsonConvert.DeserializeObject 肯定会返回null。因此,如果您尝试引用一个null对象的属性,它将抛出一个异常,这似乎正是这里发生的事情。

我的猜测是,您从服务器返回某种错误,而不是您期望的响应。您的代码不会检查我可以看到的HTTP错误;它只是盲目地尝试处理响应,假设它是成功的。您应该使用像Fiddler这样的Web调试代理来查找您实际从服务器获取的内容。然后,您应该使用适当的错误处理和空检查来增强代码。有关详细信息,请参阅What is a NullReferenceException, and how do I fix it?