Navicat Premium 导出 JSONB 字段时字段名无引号、格式非法,因其默认以文本表示导出而非标准 JSON,未调用 PostgreSQL 的 JSON 序列化逻辑,导致 {name: "Alice"} 等非法格式;须用 jsonb_pretty()、to_jsonb() 或 COPY 命令绕过该缺陷。
Navicat Premium 导出 JSONB 字段时为什么字段名没引号、格式非法?
因为 navicat 默认导出的是「文本表示」而非标准 json,jsonb 字段在结果集中被当作普通字符串输出,不经过 json 编码——比如 {name: "alice", age: 25}(缺双引号)或带多余空格/换行,直接导致 json.parse() 报 syntaxerror: unexpected token。
根本原因不是数据错,而是 Navicat 没调用 PostgreSQL 的 JSON 序列化逻辑,只是把二进制解析后的原始字符串拼进去。它不区分 json 和 jsonb 类型,一律当 text 处理。
- 导出向导里选“JSON”格式,只影响外层结构(如是否每行一条),不触发字段级 JSON 转义
-
jsonb_column直接 SELECT 出来,在 Navicat 网格中显示正常,但导出时不会自动加引号、转义双引号或处理换行符 - 若字段值含中文、单引号、换行符,导出后大概率 JSON 格式损坏,且无任何警告
必须用 SQL 查询包裹 jsonb_column → text 转换
绕过 Navicat 的导出逻辑,让 PostgreSQL 自己完成合法 JSON 渲染:用 ->> 提取为 text,或用 to_jsonb() + jsonb_pretty() 强制标准化。
- 提取单个键:
SELECT jsonb_column->>'name' AS name FROM table—— 输出纯字符串,适合简单展平 - 保持完整结构并标准化:
SELECT jsonb_pretty(jsonb_column) FROM table—— 输出带缩进、双引号、正确转义的 JSON 文本 - 若需嵌入到更大对象中:
SELECT jsonb_build_object('id', id, 'data', jsonb_pretty(jsonb_column)) FROM table - 导出前加
SET client_encoding = 'UTF8';,避免中文乱码导致 JSON 解析失败
导出为文件时别信“另存为”,用 COPY 或命令行重定向
Navicat 的“导出向导 → 保存为文件”对 JSONB 场景极不可靠:会自动加 BOM、截断长行、吞掉换行、甚至把 jsonb_pretty() 的缩进全压成一行。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 最稳方式:在查询窗口执行
COPY (SELECT jsonb_pretty(jsonb_column) FROM table WHERE ...) TO '/tmp/data.json';(路径需数据库用户有写权限) - 若无服务端写权限,用 psql 命令行:
psql -t -c "SELECT jsonb_pretty(jsonb_column) FROM table" > data.json,-t关闭表头和分隔线 - 绝对不要勾选“导出表结构”,否则输出混入
CREATE TABLE语句,JSON 文件直接失效 - 导出路径避免中文或空格,Navicat 对非 ASCII 路径处理异常,常静默失败
大结果集导出 JSON 的内存陷阱
jsonb_pretty() 是内存密集型操作,10 万行 JSONB 数据可能撑爆 Navicat 进程或触发 PostgreSQL work_mem 限制,表现是查询卡死、导出文件为空或只有前几 KB。
- 分页导出:用
LIMIT/OFFSET或游标(DECLARE c CURSOR FOR ...),每次导出 1000 行,再用脚本合并 - 禁用美化:
to_jsonb(jsonb_column)::text比jsonb_pretty()快 3–5 倍,且不占额外内存 - 终极方案:放弃 Navicat 导出,用 Python 脚本流式读取 +
json.dumps(..., ensure_ascii=False)写入,可控性远高于 GUI 工具
真正麻烦的从来不是“怎么点出来”,而是 JSONB 导出时那些不报错却悄悄损坏格式的环节——比如空格、BOM、NULL 字段处理、以及你以为它在序列化其实只是在拼字符串。

















