WebAPI接收JSON POST请求时参数msg为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

