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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:24:24