You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js使用pg包存取PostgreSQL JSON字段出现解析错误如何解决

问题原因排查与解决

你遇到的转义、JSON解析报错问题,核心来自两个层面:

  • 你看到的"是HTML实体转义字符,说明查询结果在输出前被额外做了HTML编码,不是pg包返回的原生内容
  • pg包的JSON类型解析配置缺失,没有自动将数据库返回的JSON字段转为JS对象

临时解决方案

1. HTML实体解码

如果暂时无法定位转义的触发位置,可以先对返回的字符串做解码再解析:

function decodeHtml(str) {
  return str.replace(/"/g, '"')
    .replace(/&/g, '&')
    .replace(/&lt;/g, '<')
    .replace(/&gt;/g, '>');
}

// 处理返回结果
const rawValue = '[{&quot;type&quot;:&quot;din&quot;,&quot;on&quot;:1,&quot;off&quot;:2},{&quot;type&quot;:&quot;dou&quot;,&quot;on&quot;:3,&quot;off&quot;:4}]';
const jsonData = JSON.parse(decodeHtml(rawValue));

2. 配置pg包自动解析JSON类型

pg包默认支持自动解析JSON/JSONB字段为JS对象,若配置被覆盖可以手动注册类型解析器:

const { types } = require('pg');

// PostgreSQL JSON类型oid为114,JSONB类型oid为3802
[114, 3802].forEach(oid => {
  types.setTypeParser(oid, val => val === null ? null : JSON.parse(val));
});

配置完成后查询结果里的unit_capabilities字段会直接返回JS对象,无需手动解析。


JSON字段存取最优方案

1. 数据库层优化

优先使用JSONB类型替代JSON类型,JSONB为二进制存储结构,支持索引、查询效率远高于原生JSON类型,修改字段类型语句:

ALTER TABLE unit 
ALTER COLUMN unit_capabilities TYPE JSONB 
USING unit_capabilities::JSONB;

2. 写入操作最佳实践

不要手动拼接JSON字符串,使用参数化查询直接传入JS对象,pg包会自动处理类型转换,完全避免转义错误:

const { Pool } = require('pg');
const pool = new Pool({ /* 数据库配置 */ });

// 直接传入JS对象作为参数
const unitData = [
  {"type": "din", "on": 1, "off": 2}, 
  {"type": "dou", "on": 3, "off": 4}
];

await pool.query(
  `INSERT INTO unit (unit_capabilities) VALUES ($1)`,
  [unitData]
);

3. 查询操作最佳实践

涉及JSON字段过滤时,优先使用PostgreSQL原生JSONB操作符在数据库层过滤,不要全量查询后在应用层处理,性能提升非常明显:

// 示例:查询unit_capabilities中包含type=din的记录
const res = await pool.query(
  `SELECT * FROM unit WHERE unit_capabilities @> $1::JSONB`,
  ['[{"type": "din"}]']
);

内容的提问来源于stack exchange,提问作者xyz83242

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:45:04