I have a table with a column of type JSON in my PostgreSQL DB (9.2). I have a hard time to map this column to a JPA2 Entity field type.

I tried to use String but when I save the entity I get an exception that it can't convert character varying to JSON.

在处理JSON列时,正确的值类型是什么?

@Entity
public class MyEntity {

    private String jsonPayload; // this maps to a json column

    public MyEntity() {
    }
}

一个简单的解决方法是定义一个文本列.

推荐答案

See PgJDBC bug #265.

PostgreSQL对数据类型转换的要求过于严格,令人恼火.即使是像xmljson这样的类似文本的值,它也不会隐式强制转换text.

解决此问题的严格正确方法是编写使用JDBC setObject方法的自定义Hibernate映射类型.这可能有点麻烦,所以您可能只想通过创建较弱的强制转换来降低PostgreSQL的严格程度.

正如@markdsievers在 comments 和this blog post中指出的,这个答案中的原始解决方案绕过了JSON验证.所以这不是你真正想要的.更安全的做法是:

CREATE OR REPLACE FUNCTION json_intext(text) RETURNS json AS $$
SELECT json_in($1::cstring); 
$$ LANGUAGE SQL IMMUTABLE;

CREATE CAST (text AS json) WITH FUNCTION json_intext(text) AS IMPLICIT;

AS IMPLICIT告诉PostgreSQL它可以在没有明确告知的情况下进行转换,这样就可以工作:

regress=# CREATE TABLE jsontext(x json);
CREATE TABLE
regress=# PREPARE test(text) AS INSERT INTO jsontext(x) VALUES ($1);
PREPARE
regress=# EXECUTE test('{}')
INSERT 0 1

感谢@markdsievers指出了这个问题.

Json相关问答推荐

无法根据vega规范中的条件设置文本 colored颜色

Jolt Transformation—如果子对象为空,则将父对象更新为空

如何在Gatsby/Reaction中获取JSON-File子 node

如何在JQ过滤器文件中使用多行?

如何将文件夹组织的.json文件合并为一个JSON文件,文件夹/文件名作为键

jq如何合并两个json对象

如何在JQ中展平多维数组

如何按键过滤

jq - 将父键值提取为子元素旁边的逗号分隔值

Golang gin接收json数据和图片

解析 JSON API 响应

一起使用 Argparse 和 Json

什么是类型和类型令牌?

JSON对象中的JavaScript递归搜索

如何转换为 D3 的 JSON 格式?

确保数组中的项目属性在 Json Schema 中是唯一的?

设置对象不是 JSON 可序列化的

将多个值存储在json中的单个键中

如果键可能不存在,则从 Python dict 读取

如何使用 SwiftyJSON 遍历 JSON?