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

PostgreSQL原生查询:JSON值存储异常问题排查

PostgreSQL原生查询JSON存储格式错误修复方案

问题根源

你当前存储的JSON带外层引号和转义字符,核心原因是to_json()函数把传入的JSON字符串当作普通文本处理,将其包装成了JSON的字符串类型。比如传入"{\"user_id\":\"12345\"}",to_json()会把它转成JSON值"{\"user_id\":\"12345\"}"(即存储为带引号的字符串),而非解析成JSON对象。

修复方案

根据userData.userData的实际类型,选择对应方案:

方案1:如果userData.userData是预先序列化好的JSON字符串

直接将字符串转换为PostgreSQL的json或jsonb类型插入,无需使用to_json():

@Transactional
@Modifying
@Query(value = "INSERT INTO USER_DATA_TEST (USER_DATA) VALUES (cast(:#{#userData.userData} as json))",
        nativeQuery = true)
public void saveUserData(@Param("userData") UserData userData);

如果你的字段类型是jsonb(推荐用于索引和复杂查询),把cast目标改成jsonb即可:

@Transactional
@Modifying
@Query(value = "INSERT INTO USER_DATA_TEST (USER_DATA) VALUES (cast(:#{#userData.userData} as jsonb))",
        nativeQuery = true)
public void saveUserData(@Param("userData") UserData userData);

方案2:如果userData.userData是Java对象(未序列化)

直接使用to_jsonb()(或to_json())将Java对象转换为JSON对象存储,此时JPA会自动处理对象到JSON的序列化:

@Transactional
@Modifying
@Query(value = "INSERT INTO USER_DATA_TEST (USER_DATA) VALUES to_jsonb(:#{#userData.userData})",
        nativeQuery = true)
public void saveUserData(@Param("userData") UserData userData);

验证

执行插入后,查询表数据:

SELECT USER_DATA FROM USER_DATA_TEST;

预期结果应为不带外层引号和转义的JSON对象:

{"user_id": "12345", "user_name": "test_name", "email": "test@test.com"}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:15:38