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; }
额外提示
- 记得把
yourActualApiKey替换成你真实的NewsAPI密钥; - 生产环境中,建议复用
HttpClient实例(比如通过依赖注入),而不是每次创建新对象,避免耗尽套接字资源; - NewsAPI的v1版本已经比较老旧,推荐使用v2版本的接口,功能更完善。
内容的提问来源于stack exchange,提问作者saviour123
相关产品推荐
相关产品推荐

