如何反序列化具有不同结果的 JSON 对象

how to deserialize a json object with different outcomes

提问人:Bernard Black the Second 提问时间:10/27/2023 最后编辑:Heretic MonkeyBernard Black the Second 更新时间:10/28/2023 访问量:78

问:

当我调用 Web API 时,我得到了一个普通对象或一个错误对象(如果发生错误),如下所示;

{
    "fault": {
        "correlationId": "ea0323ad-8883-47e6-bcc7-6acf17218b92",
        "faultCode": "ERR-044",
        "faultString": "Authentication policy failed! JWT is not valid!",
        "faultStatusCode": "401",
        "responseFromApi": ""
    }
}

是否可以在不知道它是普通对象或错误对象的情况下反序列化返回的 json 字符串?

C# JSON .NET json.net

评论

0赞 gunr2171 10/27/2023
是的。您使用哪个库来反序列化 JSON?Newtonsoft.Json、System.Text.Json,还有别的东西吗?
0赞 Bernard Black the Second 10/27/2023
Newtonsoft.Json(牛顿软件.Json)
2赞 gunr2171 10/27/2023
你知道 JToken.Parse() 方法吗?stackoverflow.com/a/57681402/1043380
0赞 dbc 10/27/2023
服务器是否在发生错误时返回错误状态代码?如果是这样,可以检查如使用 HttpClient.GetFromJsonAsync() 中所示,如何在没有额外 SendAsync 调用的情况下处理基于 HttpStatusCode 的 HttpRequestException?,或者按照 EnsureSuccessStatusCode 的用法和它引发的 HttpRequestException 的处理中所示进行调用。HttpResponseMessage.IsSuccessStatusCodeHttpResponseMessage.EnsureSuccessStatusCode()
0赞 dbc 10/27/2023
如果服务器在发生错误时没有返回错误状态代码,我建议修复它。因为检查状态代码会比检查 JSON 内容更容易。

答:

1赞 Qiang Fu 10/28/2023 #1

只需检查它是否是带有键“fault”的 json 对象,然后选择去掉模型或错误。

string jsonString= await response.Content.ReadAsStringAsync();
var jsonData = (JObject)JsonConvert.DeserializeObject(jsonString);
if (jsonData.ContainsKey("fault"))
{
    ...
}
else
{
    ...
}