空对象无法转换为值类型。

5
我正在从用户提供的预订号码向我的ASP.NET Web API请求预订信息。我的问题是,如果预订号码不存在,则Web API仍然返回一个对象,但值为null。如何检查返回的JSON对象是否为nullHttpClient请求:
 var response = await client.PostAsJsonAsync(strRequestUri, value);

if (response.IsSuccessStatusCode)
{
    string jsonMessage;
    using (Stream responseStream = await response.Content.ReadAsStreamAsync()) // put response content to stream
    {
        jsonMessage = new StreamReader(responseStream).ReadToEnd(); 
    }
    // I'm getting the error from here when I'm casting the json object to my return type.
    return (TOutput)JsonConvert.DeserializeObject(jsonMessage, typeof(TOutput)); // TOutput is a generic object
}

示例返回的JSON对象:

{
    "BookingRef": null,
    "City": null,
    "Company": null,
    "Country": null,
    "CustomerAddress": null,
    "CustomerFirstName": null,
    "CustomerPhoneNumber": null,
    "CustomerSurname": null,
    "Entrance": null
}

为什么要使用通用对象而不是定义一个可以强类型使用的对象? - Ramy M. Mousa
1
你有没有找到这个问题的解决方案?我也遇到了同样的问题。对我来说,在反序列化部分也会抛出异常。 - Emil
1个回答

2

一种选择是在属性上使用后期绑定:

var result = JsonConvert.DeserializeObject(jsonMessage, typeof(TOutput));
if (((dynamic)result).BookingRef == null)
{
    // Returning null - do whatever is appropriate
    return null;
}
else
{
    return (TOutput)result;
}

1
嗨Lars,当我执行JsonConvert.DeserializeObject(jsonMessage, typeof(TOutput))时,我已经遇到了错误。另外,我忘了提到TOutput是一个通用对象。 - Romeo
嗨@rcadaoas,我假设TOutput很可能是泛型。 :) 你能具体说明你遇到的“错误”吗?DeserializeObject调用是否抛出异常?如果该调用仅返回一个带有一堆空值的对象,则上述方法仍应有效。否则,您可以使用try-catch块包装DeserializeObject调用。 - Lars Kemmann
嗨, Lars。是的,“无法将空对象转换为值类型”错误是由DeserializeObject抛出的。而且,是的,我已经用try catch块将其包装起来了。 - Romeo
好的,但我现在有点困惑。你发布的“样本返回的JSON对象”是什么?我原以为那是DeserializeObject调用的结果。如果不是,那个JSON片段显示的是什么? - Lars Kemmann
虽然上面回答了正文中的问题,但它并没有解决错误信息。 - Joshua Drake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接