提问人:Win Sunday 提问时间:5/10/2023 最后编辑:Petter HesselbergWin Sunday 更新时间:5/11/2023 访问量:45
如何处理“ System.InvalidCastException:反序列化 API 调用的结果时
how to handle" System.InvalidCastException: when Deserializing the result of an API call
问:
我不确定我是否正确地构思了标题,但无论如何我都希望我能得到一些帮助。我正在尝试使用一个 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
});
答:
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 ...
评论
var result = await client.PostAsync("provideCustomerDetails", content);