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

使用Json.net反序列化API返回JsonArray的技术咨询

如何用Json.NET反序列化API返回的JSON数组?

我来帮你搞定这个JSON数组反序列化的问题,结合你给出的代码片段,咱们一步步来:

第一步:确保安装了Json.NET包

首先得确认你的项目里已经引用了Newtonsoft.Json(也就是Json.NET),如果还没装,直接通过NuGet安装就行:

Install-Package Newtonsoft.Json

或者在Visual Studio的NuGet包管理器里搜索"Newtonsoft.Json"安装。

第二步:定义和JSON结构匹配的实体类

API返回的JSON数组里,每个元素都是一个对象,你需要先把这个对象的结构映射成C#类。比如假设你调用的是人脸检测API,返回的每个元素包含FaceId、人脸矩形这些字段,那对应的类可以这么写:

public class Face
{
    // 如果JSON字段名和C#属性名一致,直接定义就行
    public string FaceId { get; set; }
    public FaceRectangle FaceRectangle { get; set; }
    
    // 如果有其他返回字段(比如请求了details的FaceAttributes),继续添加对应的属性
    // 要是JSON字段名和C#命名风格不一样,用JsonProperty特性映射,比如:
    // [JsonProperty("face_attributes")]
    // public FaceAttributes FaceAttributes { get; set; }
}

public class FaceRectangle
{
    public int Top { get; set; }
    public int Left { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }
}

第三步:修改你的请求方法,完成反序列化

注意你的MakeAnalysisRequest用了async void,普通方法建议改成async Task(async void更适合事件处理场景),然后在获取API响应后,用JsonConvert.DeserializeObject<List<Face>>()来反序列化JSON数组。完整的代码示例如下:

// 把async void改成async Task,方便调用和异常处理
static async Task MakeAnalysisRequest(string imageFilePath)
{
    // 用using包裹HttpClient,自动释放资源
    using (HttpClient client = new HttpClient())
    {
        // 请求头
        client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);

        // 请求参数,第三个可选参数为"details"
        string requestParameters = "returnFaceId=true";

        // 组装REST API调用的URI(这里补全你的uriBase)
        string uri = $"{uriBase}?{requestParameters}";

        // 读取图片文件,准备请求内容(根据API要求,这里用字节流上传)
        byte[] byteData = File.ReadAllBytes(imageFilePath);
        using (ByteArrayContent content = new ByteArrayContent(byteData))
        {
            content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

            // 发送POST请求并获取响应
            HttpResponseMessage response = await client.PostAsync(uri, content);
            // 确保请求成功,否则抛出异常(避免处理错误的响应内容)
            response.EnsureSuccessStatusCode();

            // 读取响应的JSON字符串
            string jsonResponse = await response.Content.ReadAsStringAsync();

            // 关键步骤:反序列化JSON数组为List<Face>
            List<Face> detectedFaces = JsonConvert.DeserializeObject<List<Face>>(jsonResponse);

            // 现在就可以遍历处理每个Face对象了
            foreach (var face in detectedFaces)
            {
                Console.WriteLine($"检测到人脸ID:{face.FaceId}");
                Console.WriteLine($"人脸位置:Top={face.FaceRectangle.Top}, Left={face.FaceRectangle.Left}, 宽={face.FaceRectangle.Width}, 高={face.FaceRectangle.Height}");
            }
        }
    }
}

几个关键注意点

  • 为什么用List<Face>:因为API返回的是JSON数组,Json.NET会把数组直接反序列化为泛型列表,方便你遍历和操作。
  • 字段映射:如果JSON里的字段名和C#属性名不匹配(比如JSON用下划线命名,C#用驼峰),一定要用[JsonProperty("json_field_name")]特性来做映射,不然反序列化会失败。
  • 资源释放:用using包裹HttpClient和ByteArrayContent,确保资源被正确释放,避免内存泄漏。
  • 异常处理:可以在方法里添加try-catch块,处理请求失败或者反序列化出错的情况,让代码更健壮。

内容的提问来源于stack exchange,提问作者Soumya Khurana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:33:15