Yahoo! Finance API返回JSON映射C#对象及反序列化报错问题咨询
问题根因
报错的根本原因是直接对HttpWebResponse对象调用ToString()方法,该方法没有被重写,默认返回的是对象的类型名称字符串System.Net.HttpWebResponse,而非接口返回的JSON内容,所以Newtonsoft解析时第一个字符遇到'S'就抛出了格式异常。
解决方案
正确读取响应流中的JSON内容
你需要从HttpWebResponse的响应流中读取实际返回的JSON字符串,再执行反序列化操作,适配你现有代码的修改示例如下:
string BaseURL = "https://yfapi.net/v6/finance/quote?symbols=AAPL"; string addSymbol = "%2C"; string URL = BaseURL; foreach (string stock in stocks) { URL += addSymbol + stock; } HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); request.Headers.Add("X-API-KEY", "[My API key]"); // 用using块自动释放响应资源 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { Console.WriteLine(response.ContentType); Console.WriteLine(response.StatusCode); // 从响应流读取完整JSON字符串 using (StreamReader sr = new StreamReader(response.GetResponseStream())) { string jsonContent = sr.ReadToEnd(); // 传入实际JSON字符串完成反序列化 Results result = JsonConvert.DeserializeObject<Results>(jsonContent); } }
额外注意事项
- 所有实现了
IDisposable接口的对象(如HttpWebResponse、StreamReader)建议用using块包裹,自动释放资源避免内存泄漏 - 确认自定义的
Results、Stock类的属性访问修饰符为public,且嵌套层级和你用Postman拿到的JSON结构完全匹配,避免反序列化时属性值为null的问题 - 如果你使用的是.NET Core 3.0+ / .NET 5+版本,也可以选择系统内置的
System.Text.Json库完成反序列化,无需引入第三方Newtonsoft库
内容的提问来源于stack exchange,提问作者Roel Stam
相关产品推荐
相关产品推荐

