在PostgreSQL> = 10

时间:2019-05-27 15:25:35

标签: json postgresql

使用PostgreSQL 9.6,可以将嵌入为JSON的JSON转换为JSON,如下所示:

# select * from json_to_record('{"key":"{\"embedded\": 42}"}') as x(key json);
       key        
------------------
 {"embedded": 42}
(1 row)

对于PostgreSQL 10及更高版本,此操作失败:

# select * from json_to_record('{"key":"{\"embedded\": 42}"}') as x(key json);
ERROR:  invalid input syntax for type json
DETAIL:  Token "embedded" is invalid.
CONTEXT:  JSON data, line 1: "{"embedded...

PostgreSQL 10 release notes提到了populate_json及其相关功能(包括可推定的json_to_record)的更改,显然是为了处理未引用的嵌入式JSON:

  

通过此更改,可以从JSON数组正确转换目标SQL类型的数组类型字段,并从JSON对象正确转换复合类型字段。以前,这种情况会失败,因为JSON值的文本表示将被馈送到array_in()或record_in(),并且其语法与这些输入函数所期望的不匹配。

与带引号的JSON一起使用时出现的错误似乎是此更改的意外副作用。有没有办法用较新的版本实现9.6行为?

1 个答案:

答案 0 :(得分:2)

您可以先将列获取为text,然后将其强制转换为json

SELECT x.key::json
       FROM json_to_record('{"key":"{\"embedded\": 42}"}') x(key text);

db<>fiddle