You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:42:15