ASP.NET Framework 4.7.2 Web API POST端点JSON解析求助
解决方案
问题出在传入的JSON结构和你定义的Tracking类不匹配:JSON的根节点是dispatch,而Tracking对应的是该节点内部的字段结构,直接绑定自然无法正确读取数据。下面提供两种可行的解决方法:
方法一:创建包装类匹配JSON结构
定义一个包含Tracking类型属性的包装类,对应整个JSON的层级:
public class DispatchWrapper { public Tracking Dispatch { get; set; } }
然后修改POST方法,接收这个包装类,再从中提取Tracking对象:
// POST api/<controller> public void Post([FromBody]DispatchWrapper wrapper) { if (wrapper?.Dispatch != null) { Tracking tracking = wrapper.Dispatch; // 这里可以使用tracking对象的字段,比如tracking.OrderID、tracking.DispatchDate等 // 执行保存到数据库的逻辑 } }
方法二:手动解析原始JSON
如果不想新增包装类,可以直接读取原始JSON字符串,使用Newtonsoft.Json(Web API默认依赖的JSON库)手动解析:
using Newtonsoft.Json.Linq; // POST api/<controller> public void Post([FromBody]JObject json) { JToken dispatchToken = json["dispatch"]; if (dispatchToken != null) { Tracking tracking = dispatchToken.ToObject<Tracking>(); // 后续使用tracking对象操作数据库 } }
或者也可以直接读取请求流来获取JSON:
using System.IO; using Newtonsoft.Json; // POST api/<controller> public async Task<IHttpActionResult> Post() { string jsonString = await new StreamReader(Request.Content.ReadAsStreamAsync()).ReadToEndAsync(); JObject json = JObject.Parse(jsonString); Tracking tracking = json["dispatch"].ToObject<Tracking>(); // 保存到数据库逻辑 return Ok(); }
关键注意事项
- 确保外部请求的
Content-Type请求头设置为application/json,Web API默认仅处理该类型的请求体。 - 检查
DispatchDate字段的格式:JSON中的日期是字符串"2020-11-20",Web API的默认序列化器可以自动将其转换为DateTime类型,但如果有格式差异,可能需要添加[JsonConverter(typeof(IsoDateTimeConverter))]特性到Tracking类的DispatchDate属性上。
内容的提问来源于stack exchange,提问作者Matthew Mccall
相关产品推荐
相关产品推荐

