调用REST API时自定义类型接收JSON参数为null的问题求助
问题解决:自定义结构体接收请求体时URL字段为null的原因与修复
问题根源
你遇到的核心问题是客户端发送的请求体是JSON字符串类型,而非直接的JSON对象。客户端实际发送的内容是被引号包裹的字符串:
"{\"URL\":\"https://www.example.com/s/otherdetail\"}"
这个内容本质是一个字符串,内部才是目标JSON对象结构。而自定义的URLpacket结构体期望直接接收JSON对象(即{"URL":"xxx"}),序列化器无法将字符串映射到结构体结构,导致URL字段为null;又因为请求体本身是合法的JSON字符串,所以不会抛出错误。
修复方案
方案1:修正客户端发送的请求体(推荐)
直接发送原始JSON对象,不要将其包裹为字符串。正确的请求体内容应为:
{"URL":"https://www.example.com/s/otherdetail"}
修改后,原有的结构体接收代码即可正常工作,packet.URL会被正确赋值。
方案2:服务端适配客户端的发送格式(若客户端无法修改)
如果客户端无法调整发送内容,服务端可以先接收字符串,再手动反序列化为结构体:
public struct URLpacket { public string URL; } [HttpPost("UploadURL/{SpecID}/{DocType}")] public ActionResult<string> UploadSpecsURL(int SpecID, string DocType, [FromBody] string jsonString) { var packet = System.Text.Json.JsonSerializer.Deserialize<URLpacket>(jsonString); // 后续处理逻辑 return Ok(packet.URL); }
或者继续使用JsonElement中转处理:
[HttpPost("UploadURL/{SpecID}/{DocType}")] public ActionResult<string> UploadSpecsURL(int SpecID, string DocType, [FromBody] JsonElement body) { // 提取字符串内容并反序列化 string innerJson = body.GetString(); var packet = System.Text.Json.JsonSerializer.Deserialize<URLpacket>(innerJson); return Ok(packet.URL); }
内容的提问来源于stack exchange,提问作者BWhite
相关产品推荐
相关产品推荐

