.Net Core API POST报期望JSON字面量null错误的原因与修复方法
错误原因
你设置了请求头Content-Type: application/json,但没有对传入data参数的JS对象做JSON序列化:jQuery在接收到对象类型的data时,默认会将其序列化为application/x-www-form-urlencoded格式的字符串,也就是你报错信息里看到的noticeNumber=Hello%2C%20world!,这根本不是合法的JSON格式。
.NET Core 内置的System.Text.Json解析器收到请求后,会按照声明的Content-Type以JSON规则解析请求体,读取到首字符为n时,会默认尝试匹配JSON的保留字面量null,但后续字符完全不符合null的拼写规则,因此直接抛出了*Expected the literal 'null'*的400错误。你直接传null时,jQuery会将其转换为非JSON格式的空内容/表单字符串,同样会触发相同的解析错误。
该错误和你定义的属性是否为可空类型没有关系,错误发生在参数绑定之前的请求体解析阶段。
JSON字面量判定规则
System.Text.Json 解析JSON内容时遵循标准JSON规范,根级合法值仅支持以下6类,解析时会逐字节做精确匹配:
- 对象:以
{起始、}结尾的键值对结构 - 数组:以
[起始、]结尾的值列表 - 字符串:以双引号
"包裹的转义文本 - 数字:整数、浮点数等数值类型字面量
- 布尔值:精确匹配小写字面量
true、false - 空值:精确匹配小写字面量
null
只要首字符匹配到某类字面量的起始字符,后续字节必须完全符合对应字面量的格式要求,否则就会抛出字面量不匹配的解析错误。
修复方案
二选一即可:
- 方案1(推荐,适配复杂参数场景):保留JSON提交格式,手动将数据序列化为合法JSON字符串后再传入,修改前端请求代码如下:
var data2 = { noticeNumber: "Hello, world!" } $.ajax({ url: "https://localhost:portNumber/receipts/post_insertReceipt", type: "POST", xhrFields: { withCredentials: true }, contentType: "application/json", // 新增JSON序列化步骤 data: JSON.stringify(data2), success: function(data) { /* 成功逻辑 */ }, error: function(xhr) { /* 错误逻辑 */} })
.NET Core 默认的模型绑定支持大小写不敏感匹配,前端传小驼峰的noticeNumber可以正常绑定到C#类帕斯卡命名的NoticeNumber属性,不需要额外修改后端代码。
- 方案2(仅适合简单扁平参数场景):删除ajax配置里的
contentType: "application/json"行,让jQuery使用默认的表单编码格式提交数据,后端的模型绑定器也可以正常解析参数,但对嵌套对象、数组等复杂结构的兼容性弱于JSON格式。
内容的提问来源于stack exchange,提问作者Muroxxas
相关产品推荐
相关产品推荐

