获取api响应时出错对象引用未设置为对象的实例

时间:2016-10-05 12:01:58

标签: c# asp.net-mvc asp.net-mvc-5

问题

一旦我收到回复并尝试存储它,该对象为空,我收到此错误:

Object reference not set to an instance of an object.

代码

var result = await response.Content.ReadAsStringAsync();
var jsonResult = JsonConvert.DeserializeObject<dynamic>(result);
var value = (JToken)jsonResult.value;

图像

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

在尝试之前尝试检查jsonResult!= null(JToken)jsonResult.value

[编辑]

你可以使用var value =(JToken)jsonResult;最后不需要.value。

        var result = "{ \"id\": \"/apis/574c167dcd7c3216c8c633b3\", \"name\": \"Servicedesk and Operations\", \"description\": \"Servicedesk and Operations Internal API\", \"serviceUrl\": \"dev-endpoint.com\", \"path\": \"test\", \"protocols\": [ \"http\", \"https\" ], \"authenticationSettings\": { \"oAuth2\": null, \"openid\": null }, \"subscriptionKeyParameterNames\": { \"header\": \"Ocp-Apim-Subscription-Key\", \"query\": \"subscription-key\" } }";
        var jsonResult = JsonConvert.DeserializeObject<dynamic>(result);
        var value = (JToken)jsonResult;
        var id = value["id"].ToString();

[额外编辑]

或者你可以选择

         var id2 = jsonResult.id;

因为那里有动态

答案 1 :(得分:1)

当您具有属性/方法/等的引用时,会出现

Object reference not set to an instance of an object。特定类型应该具有变量,该变量最终在运行时解析为null。在发布的代码中,只有两个机会可以实现:

  1. response.Content.ReadAsStringAsync(),其中responseContent为空。
  2. jsonResult.value,其中jsonResult为空。
  3. 我的猜测是它实际上Content为空,因为如果响应中没有正文(并且没有必要),则Content未初始化。一般来说,每当你有一些可能为null的东西时,即使你从未想到它,你应该总是通过显式检查带有if语句的值来捕获它:

    if (foo != null)
    {
        ...
    }
    

    三元:

    var bar = foo != null ? foo.Bar : "default";
    

    或null coalesce:

    var bar = (foo ?? new Foo()).Bar;