form.val() 返回标准 JS 对象,但 checkbox/radio 若未配置 lay-skin 和 lay-filter 会返回 "on";需确保皮肤和过滤器匹配,用 JSON.stringify() 序列化,提交时设 Content-Type 为 application/json,日期和文件需手动处理。
form.val() 直接返回对象,但 checkbox/radio 值常是 "on"
你调用 form.val('filter-name') 得到的确实是标准 js 对象,不是字符串——这是第一步要明确的。问题出在 checkbox 和 radio:如果没加 lay-skin="primary" 或没绑定 lay-filter,layui 不接管它们的状态,就直接读原生 dom 的 checked 属性,选中时返回 "on",而不是你写的 value="reading"。
常见错误现象:后端收到 {"hobby":"on"},而不是 {"hobby":["reading","sports"]}。
- 确保每个
<input type="checkbox">都有lay-skin="primary"(或lay-skin="switch"等 Layui 皮肤) -
form标签或包裹容器必须带lay-filter="xxx",且和form.val('xxx')的参数完全一致 - 别靠
name相同自动聚合——Layui 只对带lay-filter的元素做语义解析
JSON.stringify() 是最稳的序列化方式
拿到 form.val() 返回的对象后,直接 JSON.stringify() 即可。它天然支持数组(如多选 checkbox)、null、布尔值、数字,不需要额外处理类型。
不要用 form.serialize() 或 $('#form').serializeJSON():前者不编码、不处理未选中的 checkbox;后者是 jQuery 插件,对 Layui 自定义控件兼容性差,且默认忽略未勾选项。
示例:
const data = form.val('user-form');
const jsonStr = JSON.stringify(data); // → {"username":"张三","hobby":["reading","sports"]}
注意:如果字段值可能为 null 或 undefined,JSON.stringify() 会正确省略该键,符合多数后端预期;若需保留空字符串,提前做 data.field = data.field ?? ''。
提交 JSON 到后端时 content-type 必须设对
用 $.ajax 或 fetch 发送 JSON 字符串时,Content-Type 必须是 application/json,否则 Java 后端的 @RequestBody 会解析失败,报 400 或空对象。
常见错误:漏设 contentType,或错写成 x-www-form-urlencoded,导致后端收不到数据。
- Ajax 示例:
contentType: 'application/json;charset=utf-8' - fetch 示例:
headers: {'Content-Type': 'application/json;charset=utf-8'} - Java 后端必须用
@RequestBody YourDto dto接收,不能用@RequestParam
日期、文件等字段需要手动预处理
form.val() 不会自动转换 Date 对象或 File 对象——它只处理表单控件的 value 属性。如果你有 <input type="date">,它的 value 是字符串(如 "2026-06-30"),可直接 JSON 化;但如果是通过 JS 创建的 Date 实例,就得自己转成 ISO 字符串。
文件字段(<input type="file">)根本不会出现在 form.val() 结果里,得单独用 FormData 处理,不能混进 JSON 提交。
其他容易踩的坑:
- disabled 字段默认不出现在
form.val()结果中,如需提交,得手动补上 - 带
lay-ignore的字段会被跳过,检查是否误加 - 动态插入的表单项,必须在插入后调用
form.render(),否则form.val()读不到










