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

C#实现HTTP请求API并转换JSON及访问数据求助

解决C#中将API响应转换为JSON并访问数据的问题

我完全理解你花了6小时尝试各种方法的挫败感——C#处理JSON的方式确实和Python不太一样,不过找对方法后其实很简单。下面我帮你完善代码,同时拆解背后的逻辑:

问题根源

你原来的代码用ReadAsStreamAsync()拿到的是原始字节流,并没有完成JSON解析和反序列化的步骤。而Python里的r.json()已经帮你自动完成了解析+反序列化,所以直接就能遍历数据。C#需要我们显式完成这一步转换。

最佳方案:使用强类型模型(推荐)

强类型不仅能让你获得IDE智能提示,还能在编译时检查错误,避免拼写失误。首先我们定义和NewsAPI响应结构匹配的模型类:

// 对应NewsAPI的返回结构
public class NewsApiResponse
{
    public string Status { get; set; }
    public int TotalResults { get; set; }
    public List<Article> Articles { get; set; }
}

public class Article
{
    public string Author { get; set; }
    public string Title { get; set; }
    public string Description { get; set; } // 对应你要的"summary",NewsAPI里的字段是description
    public string Url { get; set; }
    public string UrlToImage { get; set; }
    public DateTime PublishedAt { get; set; }
    public string Content { get; set; }
}

然后修改你的save方法(注意遵循C#命名规范改成PascalCase):

using System.Net.Http.Json; // 必须引用这个命名空间,它提供了便捷的JSON扩展方法

public async Task<NewsApiResponse> Save() 
{ 
    var apiUrl = "https://newsapi.org/v1/articles?source=talksport&apiKey=yourActualApiKey"; 
    // 使用using确保HttpClient被正确释放,避免资源泄漏
    using var httpClient = new HttpClient(); 
    
    // 直接将API响应反序列化为我们定义的强类型对象
    var newsResponse = await httpClient.GetFromJsonAsync<NewsApiResponse>(apiUrl);
    
    // 遍历Articles列表(NewsAPI的文章数据都在这个数组里)
    if (newsResponse?.Articles != null)
    {
        foreach (var article in newsResponse.Articles)
        {
            Console.WriteLine(article.Description); // 输出你要的"summary"内容
        }
    }
    
    return newsResponse;
}

备选方案:使用dynamic(不推荐,仅作演示)

如果你不想定义模型类,也可以用dynamic类型直接解析JSON,但这样会失去类型检查的优势,容易因为字段拼写错误导致运行时异常:

using System.Text.Json;

public async Task<dynamic> Save() 
{ 
    var apiUrl = "https://newsapi.org/v1/articles?source=talksport&apiKey=yourActualApiKey"; 
    using var httpClient = new HttpClient();
    
    // 先把响应读取为JSON字符串
    var jsonString = await httpClient.GetStringAsync(apiUrl);
    // 反序列化为dynamic对象
    dynamic data = JsonSerializer.Deserialize<dynamic>(jsonString);
    
    // 注意NewsAPI的文章数据在"articles"字段下
    foreach (var item in data.articles)
    {
        Console.WriteLine(item.description);
    }
    
    return data;
}

额外提示

  1. 记得把yourActualApiKey替换成你真实的NewsAPI密钥;
  2. 生产环境中,建议复用HttpClient实例(比如通过依赖注入),而不是每次创建新对象,避免耗尽套接字资源;
  3. NewsAPI的v1版本已经比较老旧,推荐使用v2版本的接口,功能更完善。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:42:49