使用PostgreSQL,如何在json列中转义“\”?

时间:2017-04-19 17:51:14

标签: json postgresql escaping jsonb

我正在使用Postgres 9.5并且我有一个类型为'json'的列(“info”)...我正在尝试执行此插入:

INSERT INTO table ( info )
VALUES (
  '{"entry":"((\+)[0-9]+)"}'
)

但是我收到了这个错误:

ERROR:  invalid input syntax for type json
DETAIL:  Escape sequence "\+" is invalid.

它将\+解释为转义序列,但实际上我希望将其作为我的价值的一部分。

1 个答案:

答案 0 :(得分:3)

一般来说,

  • 如果您有密钥和值,请使用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中的美元引用要求无法逃脱,但这不会有帮助,

  

请注意,在美元引用的字符串中,可以使用单引号而无需转义。实际上,美元引用字符串中的任何字符都不会被转义:字符串内容始终按字面意思书写。反斜杠不是特殊的,也不是美元符号,除非它们是与开始标记匹配的序列的一部分。

因此{strong>不会起作用,因为\+不是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);