如何为目标JSON对象发送序列化JSON?遇HTTP 422错误求助
解决HTTP 422错误:正确发送符合API要求的JSON请求
问题原因
你错误组合使用了PostAsJsonAsync和手动序列化的StringContent:
PostAsJsonAsync的核心作用是自动将传入的对象序列化为JSON字符串,同时自动设置Content-Type: application/json请求头- 你先手动把对象序列化成
StringContent再传入该方法,会触发双重序列化(把已有的JSON字符串再次序列化为JSON格式),最终发送的请求体完全不符合API预期,因此触发422(无法处理的实体)错误。
正确写法
写法一:PostAsJsonAsync推荐用法
无需手动序列化,直接传入匿名对象即可:
var bodyObj = new { memo = "Test Memo", claims = new[] { new { id = "1030003001131009259" , value = "30"}, new { id = "1030003001131009259" , value = "30"} } }; using (HttpResponseMessage response = await httpClient.PostAsJsonAsync(url, bodyObj)) { if (response.IsSuccessStatusCode) { // 处理成功逻辑 } }
写法二:手动序列化+PostAsync
如果需要手动控制序列化细节,使用PostAsync方法配合手动生成的StringContent:
var bodyObj = new { memo = "Test Memo", claims = new[] { new { id = "1030003001131009259" , value = "30"}, new { id = "1030003001131009259" , value = "30"} } }; // 手动将对象序列化为JSON字符串并构建请求内容 var jsonContent = new StringContent(JsonConvert.SerializeObject(bodyObj), Encoding.UTF8, "application/json"); // 使用PostAsync发送请求 using (HttpResponseMessage response = await httpClient.PostAsync(url, jsonContent)) { if (response.IsSuccessStatusCode) { // 处理成功逻辑 } }
额外检查点
你代码中claims数组的两个元素id完全相同,而API示例中使用的是不同id。如果目标API要求每个claim的id必须唯一,这也可能导致422错误,建议确认API的参数约束规则。
内容的提问来源于stack exchange,提问作者BlackCat
相关产品推荐
相关产品推荐

