我必须调用第三方API来检索一些数据.接口将根据搜索结果返回2种响应类型中的1种.

如果一切顺利,API将返回类似于以下内容的内容...

{
    "Items": [
        {
            "Id": "ABCD",
            "Description": "Some text here"
        },
        {
            "Id": "1234",
            "Description": "Some text here"
        }
    ]
}

但是,如果未找到任何内容或传递给搜索的值无效,则API将返回类似以下内容...

{
    "Items": [
        {
            "Error": "2",
            "Text": "Something went wrong"
        }
    ]
}

通常,我只有几个类可以用来将JSON解析为一个值集合,但我不知道如何提前知道用哪些类来解析它们.

使用Microsoft .NET Core/C#.目前,使用System.Text.Json而不是NewtonSoftJSON,但我认为这应该仍然是可以实现的

我找到了一个引用here,它提示在响应文本中搜索单词"error",但这很有可能会出现在有效数据中,老实说,这感觉像是一种肮脏的做事方式.

推荐答案

不要只查找字符串"Error",而要查找名为"Error"的 node .

假设结果为字符串,并且定义了用于保存成功响应或错误响应的类:

using (JsonDocument doc = JsonDocument.Parse(jsonString))
{
    if (doc.RootElement.TryGetProperty("Items", out var itemsArr))
    {
        if (itemsArr[0].TryGetProperty("Error", out _))
        {
            // We got an error response
            ErrorResponse err = JsonSerializer.Deserialize<ErrorResponse>(json);

            // Handle ErrorResponse
        }
        else
        {
            // We got a success response
            SuccessResponse success = JsonSerializer.Deserialize<SuccessResponse>(json);

            // Handle the successful response
        }
    }
}

Csharp相关问答推荐

如何使用Automapper映射两个嵌套列表

在Dapper中使用IasyncEum重写GetAsyncEum方法

如何使用C#和Graph API从Azure Directory获取用户详细信息

更新产品但丢失产品ASP.NET Core的形象

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

如何在没有前缀和可选后缀的情况下获取Razor Page Handler方法名称?

Rx.Net窗口内部可观测数据提前完成

为什么Regex.IsMatch(";\\t";,";\\t";)返回FALSE而不是TRUE?

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

Unix上的.NET(核心):.NET意外地未看到通过P/Invoke系统调用对环境变量进行的进程内修改

TeamsBot SendActivityActivityTypes与ActivityTypes同步.键入不再起作用

C#Null判断处理失败

有没有类似于扩展元素的合并元组的语法?

Celler ArgumentExpression是否期望在所有情况下都捕获允许空值的运算符?

如何使用ODP.NET C#设置Oracle会话时间长度限制

EF Core 7-忽略模型绑定中的虚拟属性

Azure函数正在返回值列表,但该列表在Chrome中显示为空

数据库操作预计影响1行,但实际影响0行; after _dbContext.SaveChanges();

使用DI实例化带有动态参数的服务?

无法创建工具窗口(用于VBIDE、VBA的COM加载项扩展)