【问题标题】:Using PostgreSQL, how do I escape "\" in json columns?使用 PostgreSQL,如何在 json 列中转义“\”?
【发布时间】:2017-04-19 17:51:14
【问题描述】:

我正在使用 Postgres 9.5,并且我有一个类型为“json”的列(“信息”)...我正在尝试插入:

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

但我收到此错误:

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

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

【问题讨论】:

标签: json postgresql escaping jsonb


【解决方案1】:

一般来说,

  • 如果您有键和值,请使用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);

【讨论】:

  • 这行得通,因为它会逃脱 \,但是......在数据库列中,我现在有一个额外的 \ 用于这个条目(即 ((\\+)[0-9] +) ) 当我检索此数据时。有没有办法让它返回原始的未转义值?
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2016-07-24
相关资源
最近更新 更多