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

WebAPI接收JSON POST请求时参数msg为null,如何解析?

解决WebAPI POST请求参数绑定为null的问题

嘿,我来帮你搞定这个问题!你现在遇到的msg参数始终为null的原因很明确:你的请求体是一个完整的JSON对象,但你用[FromBody] string来接收的时候,ASP.NET WebAPI默认会期望请求体是一个JSON字符串(比如用双引号包裹的纯文本内容),而不是复杂对象,所以绑定失败,返回null。

下面给你两种可行的解决方案,根据你的需求选择就行:

方案一:直接用MyModel作为参数(推荐)

这是最简单高效的方式,WebAPI会自动帮你完成JSON到模型的绑定,不需要手动调用JsonConvert.DeserializeObject,代码更简洁也不容易出错:

[HttpPost]
public void SaveMessage([FromBody] MyModel w) 
{
    db.MyModels.Add(w);
    db.SaveChanges();
}

只要你的MyModel类的属性和请求体里的字段一一对应(比如包含datetime、filename、datasourcename、error这些属性,注意大小写匹配,或者用[JsonProperty]特性指定映射关系),WebAPI就会自动把请求体的JSON解析成MyModel对象,完美解决参数为null的问题。

方案二:手动读取请求体内容(如果一定要用string接收)

如果你因为某些原因必须用string类型接收参数,那可以直接读取请求的内容流,再手动反序列化:

[HttpPost]
public async Task SaveMessage() 
{
    // 读取请求体的字符串内容
    string msg = await Request.Content.ReadAsStringAsync();
    MyModel w = JsonConvert.DeserializeObject<MyModel>(msg);
    db.MyModels.Add(w);
    db.SaveChanges();
}

这里建议把方法改成异步的,因为ReadAsStringAsync是异步方法,更符合WebAPI的最佳实践;如果一定要同步处理,也可以用ReadAsStringAsync().Result,但异步方式更推荐。

额外提示:检查MyModel的定义

不管用哪种方案,都要确保你的MyModel类定义正确,比如:

public class MyModel
{
    public DateTime DateTime { get; set; }
    public string FileName { get; set; }
    public string DataSourceName { get; set; }
    public string Error { get; set; }
}

如果JSON里的字段名和类属性名大小写不一致(比如JSON里是datetime,类里是DateTime),WebAPI默认的序列化器(或Newtonsoft.Json)会自动处理大小写不敏感的映射,但如果有特殊字段名,可以用[JsonProperty]特性明确指定:

public class MyModel
{
    [JsonProperty("datetime")]
    public DateTime DateTime { get; set; }
    [JsonProperty("filename")]
    public string FileName { get; set; }
    // 其他属性同理
}

这样就能确保JSON解析完全匹配啦!

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:16:32