layui 表单导出 json 的唯一可靠方式是 form.val('filtername'),返回标准 js 对象,需配合字段对齐、utf-8 bom 头及动态表单 name 严格校验,确保结构稳定、兼容下游系统。

form.val() 是导出数据的唯一可靠入口
别绕弯子,Layui 表单数据导出为 JSON 的核心就一句:form.val('filterName')。它返回的是标准 JavaScript 对象,天然可 JSON.stringify(),不需要 jQuery 插件、不依赖 serializeArray、也不用遍历 DOM 取值。
但注意:这个对象结构完全由表单控件的 name 属性决定,且只包含「当前存在于 DOM 中且被 Layui 接管」的字段。如果某个字段没渲染、没加 lay-filter、或 name 重复/为空,form.val() 就直接忽略它,不会报错也不会补默认值。
- 确保所有表单元素都带
lay-filter="myForm",且调用时参数一致:form.val('myForm') -
name必须扁平、唯一、非空;user.info.name这种嵌套写法会被跳过 - checkbox/radio 要有
lay-skin="primary",否则值固定为"on",不是你设的value - select 多选需加
multiple属性,否则只取第一个选中项
导出前必须手动补全未勾选的 checkbox 字段
这是最容易被忽略的坑:form.val() 默认不返回未勾选的 checkbox,导致导出 JSON 缺失字段,后端解析可能报错或用默认值覆盖。
解决方式不是改 Layui 源码,而是导出前做一次“字段对齐”:
- 先定义一个完整字段白名单数组,比如
['interest_reading', 'interest_sports', 'interest_music'] - 用
form.val('myForm')拿到已有值的对象 - 遍历白名单,对每个 key 检查是否在结果对象里存在,不存在就显式赋值为空数组(多选)或
null(单选) - 再
JSON.stringify(),确保结构稳定
示例代码片段:
const raw = form.val('myForm');
const allFields = ['interest_reading', 'interest_sports', 'agree_terms'];
const filled = {};
allFields.forEach(key => {
filled[key] = key in raw ? raw[key] : [];
});
const jsonStr = JSON.stringify(filled, null, 2);
下载 JSON 文件必须加 UTF-8 BOM 头
直接用 data:text/plain;charset=utf-8, 导出,Windows 上 Excel 打开会乱码,Notepad++ 显示 ANSI 编码——这不是文件内容问题,是 Excel 解析时没识别 UTF-8。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
关键动作就一个:在字符串前插入 BOM 头 \ufeff。
- 不要用
encodeURIComponent(jsonStr)包裹带 BOM 的字符串,会破坏 BOM - 正确写法:
'data:application/json;charset=utf-8,' + encodeURIComponent('\ufeff' + jsonStr) - 文件后缀建议用
.json,不是.txt,避免双击被错误关联
完整下载函数:
function downloadJson(filename, data) {
const bom = '\ufeff';
const a = document.createElement('a');
a.href = 'data:application/json;charset=utf-8,' + encodeURIComponent(bom + data);
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
动态表单导出时 field 名和 JSON key 必须严格对齐
如果你用 JSON 配置生成了动态表单(比如从 formConfig.json 渲染),导出的 JSON 结构必须和原始配置的 name 字段完全一致,否则后续导入或校验会断链。
常见断裂点:
- 配置里写了
"name": "user_email",但渲染时漏了name属性,DOM 里实际是name="email"→ 导出时字段名变成email - radio 的
options里value是数字1,但后端期望字符串"1"→ 导出后没类型转换,直接丢给后端易出错 - 日期控件没配
lay-key,form.val()读不到值,该字段在导出 JSON 中消失
建议在动态渲染完成后,立刻执行一次字段存在性校验:
const configFields = formConfig.fields.map(f => f.name);
const actualNames = Array.from(document.querySelectorAll('[name]')).map(el => el.name);
console.assert(configFields.every(n => actualNames.includes(n)), '表单字段缺失:', configFields.filter(n => !actualNames.includes(n)));
复杂点在于:导出 JSON 不是终点,而是配置闭环的一环。字段名错一位、少一个 BOM、漏一个 checkbox 占位,下游系统就可能解析失败——这些细节不显眼,但修复成本远高于前置检查。










