调用Baselinker API时遭遇Newtonsoft.Json解析错误求助
问题解决:Baselinker API调用Json解析错误
错误根源
你碰到的Newtonsoft.Json.JsonReaderException,核心问题是直接把HttpResponseMessage对象转成了字符串,而没有读取响应的实际内容体。Convert.ToString(response)得到的是响应对象的描述文本(比如开头是"StatusCode..."),根本不是API返回的Json数据,自然会被Json解析器判定为非法格式。
修正后的代码
private async void Button_Clicked(object sender, EventArgs e) { using (var httpClient = new HttpClient()) { using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.baselinker.com/connector.php")) { request.Headers.TryAddWithoutValidation("X-BLToken", "AAA-BBB-CCC"); request.Content = new StringContent("method=getOrders¶meters=%7B%22date_from%22%3A+1407341754%7D"); request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded"); var response = await httpClient.SendAsync(request); // 先验证请求是否成功,再读取响应内容 response.EnsureSuccessStatusCode(); var responseContent = await response.Content.ReadAsStringAsync(); var oMycustomclassname = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(responseContent); labelek.Text = oMycustomclassname.ToString(); } } }
关键修正点
- 用
await response.Content.ReadAsStringAsync()替代Convert.ToString(response),这才是获取API返回的Json内容的正确方式。 - 新增
response.EnsureSuccessStatusCode(),用于提前捕获请求层面的错误(比如4xx/5xx状态码)。 - 给
oMycustomclassname调用ToString(),避免直接将dynamic对象赋值给Text属性可能出现的显示异常。
内容的提问来源于stack exchange,提问作者harbii
相关产品推荐
相关产品推荐

