C#发送带JSON内容的HTTP PUT请求时JSON解析报错问题
问题分析与解决方案
错误原因
你当前的代码把字符串 "id: 0" 直接序列化,得到的JSON内容是 "id: 0"(一个JSON字符串),但API要求的是JSON对象(格式类似 {"id": 0})。当API尝试解析请求体时,它会读取到字符串内部的 id: 0,这不符合JSON对象的语法规范,因此在解析到第一个字符 i 时触发语法错误。
修正方案
1. 构造正确的请求体对象
不要直接使用字符串,而是创建对应的数据结构(匿名类或自定义类)来匹配API期望的JSON格式:
方式一:使用匿名类(快速实现)
var payload = new { id = 0 }; var jsonPut = JsonConvert.SerializeObject(payload);
序列化后得到的JSON是:{"id":0},完全符合API要求的对象格式。
方式二:使用自定义类(更适合复杂场景)
// 定义与API请求结构匹配的类 public class UpdateRequest { public int Id { get; set; } // 属性名需与API要求的字段名一致(注意大小写) } // 构造请求体对象 var payload = new UpdateRequest { Id = 0 }; var jsonPut = JsonConvert.SerializeObject(payload);
2. 优化后的完整代码
另外,注意不要每次请求都创建新的HttpClient实例(HttpClient设计为复用,频繁创建会导致资源泄漏),优化后的代码如下:
// 全局复用HttpClient实例 private static readonly HttpClient _httpClient = new HttpClient(); // 请求方法内代码 async Task SendPutRequest() { string url = "https://..."; Debug.WriteLine(url); // 构造符合要求的请求体对象 var payload = new { id = 0 }; var jsonContent = JsonConvert.SerializeObject(payload); var requestContent = new StringContent(jsonContent, Encoding.UTF8, "application/json"); // 设置Accept头(可全局设置一次,无需每次请求添加) _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = await _httpClient.PutAsync(url, requestContent); if (response.IsSuccessStatusCode) { Debug.WriteLine("Put made correctly"); } else { Debug.WriteLine("Error in put"); Debug.WriteLine($"Status code: {response.StatusCode}"); // 可选:获取API返回的错误详情 string errorDetails = await response.Content.ReadAsStringAsync(); Debug.WriteLine($"Error details: {errorDetails}"); } }
额外说明
- 确保属性名(如
id)的大小写与API文档要求一致,部分API对大小写敏感 - 若API有其他必填字段,需在对象中补充对应属性
内容的提问来源于stack exchange,提问作者WakiApi
相关产品推荐
相关产品推荐

