使用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行为?
答案 0 :(得分:2)
您可以先将列获取为text
,然后将其强制转换为json
。
SELECT x.key::json
FROM json_to_record('{"key":"{\"embedded\": 42}"}') x(key text);