一般来说,
- 如果您有键和值,请使用
jsonb_build_object 构造对象
- 如果您正在编写一个文字 JSON 对象以从字符串转换,那么它必须是正确的;正确的 JSON 字符串需要转义
\。
说明
PostgreSQL 没有引用这个:它只是 RFC 7159 之后的 JSON 实现。
字符串以引号开头和结尾。所有 Unicode 字符都可以放在引号内,但必须转义的字符除外:引号、反斜线和控制字符(U+0000 到 U+001F)。 [...] 因此,例如,一个仅包含一个反斜线字符的字符串可以更紧凑地表示为"\\"。
所以它的字面形式看起来像这样。
CREATE TABLE tbl
AS
SELECT '{"entry":"((\\+)[0-9]+)"}'::jsonb AS info;
PostgreSQL 中的美元报价需要禁止转义,但在这里无济于事,
请注意,在美元引用的字符串中,可以使用单引号而无需转义。实际上,美元引号字符串中的任何字符都不会被转义:字符串内容总是按字面意思书写。反斜杠不是特殊的,美元符号也不是特殊的,除非它们是与开始标记匹配的序列的一部分。
所以这将不工作,因为\+ 不是 JSON 中的有效字符串。如果我们不使用 json 类型,它会工作。
SELECT '{"key":"\"}'::jsonb;
ERROR: invalid input syntax for type json
LINE 1: SELECT '{"key":"\"}'::jsonb;
^
DETAIL: Token ""\"}" is invalid.
CONTEXT: JSON data, line 1: {"key":"\"}
但是,您可以使用 to_jsonb() 对字符串进行 JSON 转义..
SELECT FORMAT( $${%s:%s}$$, to_jsonb(k), to_jsonb(v) )::jsonb
FROM ( VALUES
('key', '\' )
) AS t(k,v);
但是,即使这是一个坏主意,因为如果你有键和值,你可以使用json_build_object,
SELECT jsonb_build_object( k, v )
FROM ( VALUES
('key', '\' )
) AS t(k,v);