如何处理“ System.InvalidCastException:反序列化 API 调用的结果时

how to handle" System.InvalidCastException: when Deserializing the result of an API call

提问人:Win Sunday 提问时间:5/10/2023 最后编辑:Petter HesselbergWin Sunday 更新时间:5/11/2023 访问量:45

问:

我不确定我是否正确地构思了标题,但无论如何我都希望我能得到一些帮助。我正在尝试使用一个 api,但我不断收到“JsonSerializationException:将值 {null} 转换为类型'System.Double'时出错”。当我尝试在底部代码中标记为错误行的中反序列化时,会发生这种情况

var response = JsonConvert.DeserializeObject<GetSalaryHistoryResponse>();

在 API 调用期间,我注意到有两个字段具有 null 值,这可能是触发错误的原因

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx);

    client.DefaultRequestHeaders.Add("API_KEY", "xxxxxxxxxxxxxxxxxxx");
    client.DefaultRequestHeaders.Add("REQUEST_ID", "xxxxxxxx");
    client.DefaultRequestHeaders.Add("MERCHANT_ID", "xxxxxxxx");
    client.DefaultRequestHeaders.TryAddWithoutValidation("AUTHORIZATION", "ConsumerKey=Q1dHREVNTzEyMzR8Q1dHREVNTw==,ConsumerToken=c5e8db0cbca54593e54f6702778d1ea129463d5555166cd1d0c46416495df82483a08c30fdd1e9fa39ceeea9bc6d8da9ba892ff3c3f326d537bc06bf8ef3ece7");

    string vv = request.ToJson();
    var content = new StringContent(request.ToJson(), System.Text.Encoding.UTF8, "application/json");
    var responseTask = client.PostAsync("provideCustomerDetails", content);
    responseTask.Wait();
    var result = responseTask.Result;
    if (result.IsSuccessStatusCode)
    {
        var readTask = result.Content.ReadAsStringAsync();
        readTask.Wait();
        var a = readTask.Result.ToString();
***Error Line:>* **     var response = JsonConvert.DeserializeObject<GetSalaryHistoryResponse>(readTask.Result);
         
        return response ;
    }
}

我看到了使用下面代码片段的提示,我还用类属性替换了,但仍然收到错误。我似乎不知道该怎么做。我只想能够将反序列化的值作为返回值发送并在其他地方使用它,谁能帮忙?attributesObject

var json = JsonConvert.SerializeObject(
    attributesObject,      
    Formatting.None,
    new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Ignore
    });
C# API 反序列化 NullReferenceException dotnet-HttpClient

评论

1赞 jeb 5/10/2023
为什么不等待任务呢?var result = await client.PostAsync("provideCustomerDetails", content);
0赞 Win Sunday 5/10/2023
使用 await 将需要我用“异步”装饰该方法,这反过来又会引发我不习惯的其他问题。我想到了responseTask.Wait();会做同样的事情。此外,我正在调用用于 Web 表单的 api。我不确定某些功能是如何工作的

答:

0赞 ssedlacek 5/10/2023 #1

请勿使用 .结果,或 .如果您不想在方法中使用 async/await,请使用 wait 方法。用。GetAwaiter() 中。GetResult() 在本例中。我可以想象你的方法类似于这个:

var response = client.PostAsync("provideCustomerDetails", content).GetAwaiter().GetResult();

if (response.IsSuccessStatusCode) 
{
   var content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
   var deserialized = JsonConvert.DeserializeObject<DesiredTypeHere>(content, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
   return deserialized;
}

评论

0赞 Win Sunday 5/10/2023
请问这个“DesiredTypeHere”是什么?
0赞 ssedlacek 5/11/2023
对不起,我提供了一个带有 JsonConvert.DeserializeObject 泛型重载的示例 - 如果您知道结果将包含的属性/类型,则可以使用 DeserializeObject<T> 直接将其反序列化为该类型。如果您不想使用泛型或不知道结果,只需使用 JsonConvert.DeserializeObject(content, jsonSerializerSettings)
0赞 Win Sunday 8/17/2023
我实际上尝试过这个,我仍然得到一个 Null ...