如何判断JSON响应匹配哪个模式?

7cjasjjr  于 2023-10-21  发布在  其他
关注(0)|答案(2)|浏览(85)

我必须调用第三方API来检索一些数据。根据搜索结果,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而不是NewtonSoft使用JSON,但我认为这仍然是可以实现的
我发现了一个引用here,它暗示了在响应文本中搜索“error”这个词,但很可能会出现在有效数据中,老实说,这感觉像是一种肮脏的做事方式。

t3irkdon

t3irkdon1#

而不是只寻找字符串“错误”,寻找一个节点名为“错误”。
将结果作为字符串给出,并定义类来保存成功响应或错误响应:

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
        }
    }
}
dvtswwa3

dvtswwa32#

public sealed record OneOrTheOther(string Id, string Description, string Error, string Text);

如果你的C#版本不支持记录,那么一个具有上述字符串属性的类(例如string Id { get; init; }string Id { get; set; } ...)是一个替代方案。
未在json中的.NET属性应保留为初始化,因此在初始化后,可以确定处置。
https://learn.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonunmappedmemberhandling?view=net-8.0&viewFallbackFrom=net-7.0
静默跳过任何未Map的属性。这是默认行为。
你可能会有不同的实现/细节,但这给出了总体思路。

相关问题