如何判断第三方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
相关产品推荐
相关产品推荐

