Http响应反序列化异常排查:本地正常但接口解析失败
问题原因与修复方案
你的核心错误是没有正确获取异步方法返回的JSON内容:ReadAsStringAsync()是异步方法,返回的是Task<string>类型,你直接调用result.ToString()得到的不是接口返回的JSON字符串,而是Task对象的默认字符串表示(类似System.Threading.Tasks.Task1[System.String]),这就是反序列化时抛出Unexpected character encountered while parsing value: S`异常的原因——你在把Task对象的字符串形式当成JSON解析,而它的开头就是字母S。
修复代码
方式一:同步等待(适合无法改为异步的场景)
直接在ReadAsStringAsync()后调用.Result等待异步任务完成,拿到实际的JSON字符串:
HttpResponseMessage response = client.GetAsync(URL+pg.urlParameters).Result; if (response.IsSuccessStatusCode) { var result = response.Content.ReadAsStringAsync().Result; var detailsList = Newtonsoft.Json.JsonConvert.DeserializeObject<Rootobject>(result); }
方式二:异步await(推荐,符合.NET异步编程规范)
把当前方法改为异步方法,用await等待异步操作完成,避免阻塞线程:
// 注意方法声明要加上async,返回类型改为Task/Task<T> public async Task ProcessResponse() { HttpResponseMessage response = await client.GetAsync(URL+pg.urlParameters); if (response.IsSuccessStatusCode) { var result = await response.Content.ReadAsStringAsync(); var detailsList = Newtonsoft.Json.JsonConvert.DeserializeObject<Rootobject>(result); } }
补充说明
你把JSON存本地后能正常反序列化,是因为存本地时你应该是正确获取到了真实的JSON内容(而非Task对象的字符串),所以本地文件里的内容是有效的JSON格式,自然能解析成功。
内容的提问来源于stack exchange,提问作者Ditty
相关产品推荐
相关产品推荐

