添加数据库字段与ApiKey后,JSON反序列化ClubModel[]失败
问题解决:JSON反序列化ClubModel[]失败
问题原因
现在API返回的JSON结构已经不是直接的ClubModel数组,而是被包裹在一个包含statusCode、body、isBase64Encoded的外层对象中,且body字段的值本身是字符串形式的JSON数组(带转义引号)。你之前直接把整个响应反序列化为ClubModel[],自然会因为外层是对象而非数组报错。
解决方法
方法1:定义外层响应模型(推荐,类型安全)
先创建一个对应API外层响应的模型:
public class LambdaApiResponse { [JsonPropertyName("statusCode")] public int StatusCode { get; set; } [JsonPropertyName("body")] public string Body { get; set; } [JsonPropertyName("isBase64Encoded")] public bool IsBase64Encoded { get; set; } }
然后修改反序列化代码,分两步处理:
// 第一步:反序列化外层响应对象 var apiResponse = JsonSerializer.Deserialize<LambdaApiResponse>(content, serializerOptions); // 第二步:从body字段中反序列化ClubModel数组 if (apiResponse != null && !string.IsNullOrWhiteSpace(apiResponse.Body)) { Clubs = JsonSerializer.Deserialize<ClubModel[]>(apiResponse.Body, serializerOptions); }
方法2:用JsonDocument手动解析(无需额外模型)
如果不想新增模型,可以直接解析JSON节点提取body内容:
using var jsonDoc = JsonDocument.Parse(content); var bodyContent = jsonDoc.RootElement.GetProperty("body").GetString(); if (!string.IsNullOrWhiteSpace(bodyContent)) { Clubs = JsonSerializer.Deserialize<ClubModel[]>(bodyContent, serializerOptions); }
额外注意
如果后续isBase64Encoded变为true,需要先对body进行Base64解码再反序列化,示例代码:
if (apiResponse.IsBase64Encoded) { var decodedBytes = Convert.FromBase64String(apiResponse.Body); bodyContent = Encoding.UTF8.GetString(decodedBytes); }
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

