Navicat导入JSON报“Invalid JSON”实为MySQL JSON字段校验所致,因其不支持跳过错误、不显示具体行号,应改用命令行分批导入或Python预处理校验。
Navicat导入JSON时提示“Invalid JSON”或“Unexpected token”
navicat本身不直接解析json内容做语法校验,这类错误实际来自mysql 5.7+的json字段类型约束——它会在insert时调用json_valid()检查。一旦某条记录的json字符串格式非法(比如尾部多逗号、单引号代替双引号、含bom头),整条insert就失败,且navicat默认不提供“跳过单条”的开关。
实操建议:
- 先用文本编辑器打开JSON文件,确认是否为标准UTF-8无BOM编码;可用
jq -n ''或在线工具快速验证单条记录 - 把原始JSON数组拆成每行一条(NDJSON格式),再用命令行分批导入,便于定位坏数据
- 如果必须用Navicat图形界面,得提前清洗:在Excel或VS Code里用正则
"([^"]*)"|'([^']*)'替换单引号为双引号,删掉//注释行(JSON不支持)
Navicat没有“忽略错误继续导入”的勾选项
Navicat的“高级”导入设置里确实没有类似MySQL Workbench的“Continue after error”复选框。它的Stop on errors是硬性行为,无法关闭。这不是UI藏得深,是功能缺失。
实操建议:
- 别依赖Navicat做容错导入——改用
mysql命令行 +LOAD DATA INFILE配合IGNORE关键字(需服务端权限) - 更稳妥的做法:用Python脚本读取JSON,对每条记录套
json.loads()捕获JSONDecodeError,只INSERT通过校验的数据 - 若表结构允许,先把目标字段临时改为
TEXT类型,导入完成后再用UPDATE ... SET json_col = CAST(text_col AS JSON)批量转换,失败的行会变成NULL而非报错
用INSERT IGNORE或ON DUPLICATE KEY UPDATE绕过重复主键但不解决JSON格式错
INSERT IGNORE只能跳过违反UNIQUE/PRIMARY KEY的记录,对JSON字段格式错误完全无效。MySQL在解析阶段就拒绝,根本到不了“插入冲突”这一步。
实操建议:
- 不要在SQL里加
IGNORE幻想能跳过JSON错误——它不会生效,错误信息还是一样 - 真正起作用的是
SET sql_mode = '';(不推荐),或切换到宽松模式SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';,但JSON校验仍强制存在 - 终极办法:在应用层预处理,例如用Node.js的
JSON.parse()+try/catch筛出合法JSON,再拼成INSERT ... VALUES (),(),...批量提交
为什么Navicat不显示具体哪一行JSON出错
因为Navicat把整个JSON文件当做一个数据源整体交给MySQL驱动处理,错误堆栈只返回MySQL服务端抛出的通用提示,比如Invalid JSON text: "The document is empty.",没带行号或偏移量。
实操建议:
- 用
jq -e -r '.[] | tostring' input.json 2>/dev/null | wc -l统计有效对象数,对比原始行数快速定位空行或损坏块 - 把JSON按100条切片,逐个导入测试,缩小问题范围
- 导出报错时Navicat生成的临时SQL文件(如果有),用
grep -n "INSERT" temp.sql | head -20找最近几条语句,人工检查对应JSON片段
最麻烦但最稳的方式,是放弃Navicat的“一键导入”,接受JSON数据天生不适合图形化批量操作的事实——格式校验和错误隔离,终究得靠代码写清楚。










