You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断第三方API返回的JSON响应匹配哪种Schema?

处理第三方API的两种JSON响应类型(System.Text.Json)

针对你遇到的这种API返回两种结构的情况,不用搜文本关键词,完全可以通过解析JSON结构并判断字段存在性来区分响应类型,以下是具体实现方案:

1. 定义强类型模型

先对应两种响应结构创建实体类:

// 成功场景的Item模型
public class SuccessItem
{
    public string Id { get; set; }
    public string Description { get; set; }
}

// 错误场景的Item模型
public class ErrorItem
{
    public string Error { get; set; }
    public string Text { get; set; }
}

// 通用外层响应模型,用JsonElement接收Items(兼容两种类型)
public class ApiResponseWrapper
{
    public JsonElement[] Items { get; set; }
}

2. 解析并判断响应类型

先把JSON解析成通用的外层模型,再通过检查Items数组中元素的字段来确定具体类型,最后转成对应的强类型:

using System.Text.Json;

// 假设apiResponseString是第三方API返回的JSON字符串
var wrapper = JsonSerializer.Deserialize<ApiResponseWrapper>(apiResponseString);

if (wrapper?.Items == null || wrapper.Items.Length == 0)
{
    // 根据API文档处理空Items的情况,比如无匹配结果的特殊场景
    return;
}

// 取第一个Item判断结构类型(API保证Items全为同类型)
var firstItem = wrapper.Items[0];
if (firstItem.TryGetProperty("Id", out _))
{
    // 解析为成功响应
    var successItems = JsonSerializer.Deserialize<SuccessItem[]>(wrapper.Items);
    // 这里处理成功数据逻辑
}
else if (firstItem.TryGetProperty("Error", out _))
{
    // 解析为错误响应
    var errorItems = JsonSerializer.Deserialize<ErrorItem[]>(wrapper.Items);
    // 这里处理错误信息逻辑
}
else
{
    // 处理未知响应结构
    throw new InvalidOperationException("收到未知格式的API响应");
}

3. 另一种方案:直接用JsonDocument解析

如果不想定义外层Wrapper类,也可以直接用JsonDocument来操作:

using (var doc = JsonDocument.Parse(apiResponseString))
{
    var root = doc.RootElement;
    if (!root.TryGetProperty("Items", out var itemsArray) || itemsArray.ValueKind != JsonValueKind.Array)
    {
        throw new InvalidOperationException("API响应格式不符合预期");
    }

    if (itemsArray.GetArrayLength() == 0)
    {
        // 处理空数组场景
        return;
    }

    var firstItem = itemsArray[0];
    if (firstItem.TryGetProperty("Id", out _))
    {
        var successItems = itemsArray.Deserialize<SuccessItem[]>();
        // 处理成功数据
    }
    else if (firstItem.TryGetProperty("Error", out _))
    {
        var errorItems = itemsArray.Deserialize<ErrorItem[]>();
        // 处理错误信息
    }
}

关键点说明

  • 这种方式基于JSON的结构属性判断,比搜索文本中的"error"更严谨,避免因字段值包含关键词导致误判
  • 前提是API保证Items数组中的元素类型统一(要么全是成功项,要么全是错误项),如果有混合场景需要额外处理
  • 可以根据API文档调整空数组的处理逻辑(比如未找到结果时是返回空Items还是带Error的Items)

内容的提问来源于stack exchange,提问作者Martin Robins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 07:25:16