.Net Core Web API无法接收JSON字符串字段值的问题求助
解决.NET Core Web API接收含JSON字符串字段时的「The input was not valid」错误
这个问题我之前也踩过坑,核心原因是请求体格式和后端JSON解析器的预期不匹配——你用单引号包裹序列化后的对象,会让后端解析器误以为内部的JSON片段是嵌套对象,直接触发格式校验失败。下面给你几个实用的解决方案,按需选择就行:
方案一:调整前端请求体格式(适配后端string参数)
如果后端必须用string类型接收,那得确保发送的是标准JSON格式的字符串值:整个请求体要用双引号包裹,并且内部的JSON字符串要做转义处理,绝对不能用单引号包裹。
举个前端代码的正确示例:
// 先把筛选器对象序列化为JSON字符串 const userFilterStr = JSON.stringify({ role: "admin", status: "active" }); const userTestFilterStr = JSON.stringify({ testCase: "login", env: "dev" }); // 组装Settings对象 const settings = { user_filter: userFilterStr, user_test_filter: userTestFilterStr }; // 关键操作:把Settings对象序列化后,再转一次JSON(让整个内容变成合法的JSON字符串值) const requestBody = JSON.stringify(JSON.stringify(settings)); // 发送PUT请求,务必设置Content-Type为application/json fetch("/api/user/profile/settings", { method: "PUT", headers: { "Content-Type": "application/json" }, body: requestBody });
这样后端拿到的就是完整的Settings JSON字符串,解析时不会把内部的JSON片段误判为嵌套对象。
方案二:后端改用强类型模型接收(更推荐)
其实更规范的做法是后端创建一个和前端Settings结构对应的模型类,直接接收整个对象,彻底避开字符串嵌套的格式问题:
// 定义与前端结构匹配的模型类 public class ProfileSettingsModel { public string UserFilter { get; set; } // 对应前端的user_filter字段 public string UserTestFilter { get; set; } // 对应前端的user_test_filter字段 } // 修改API接口方法 [HttpPut("user/profile/settings")] public IActionResult UpdateProfileSettings([FromBody] ProfileSettingsModel settings) { // 直接使用settings.UserFilter和settings.UserTestFilter即可,就是前端传的JSON字符串 // ...你的业务逻辑代码 return Ok(); }
前端这边只需要正常序列化Settings对象发送,不用额外包裹任何引号:
const settings = { user_filter: JSON.stringify(filterObj), user_test_filter: JSON.stringify(testFilterObj) }; const requestBody = JSON.stringify(settings); fetch("/api/user/profile/settings", { method: "PUT", headers: { "Content-Type": "application/json" }, body: requestBody });
这种方式符合REST API的设计规范,后续维护也更方便。
关键注意点
- 必须确保请求头的
Content-Type设置为application/json,否则后端可能不会用JSON解析器处理请求体,直接导致解析失败。 - 绝对不要用单引号包裹请求体,JSON规范只允许双引号作为字符串的边界,单引号会让解析器直接抛出格式错误。
内容的提问来源于stack exchange,提问作者mcc20
相关产品推荐
相关产品推荐

