在 PostgreSQL 中,如何生成没有反斜杠和外部双引号的干净 JSON?

In PostgreSQL, how to generate clean JSON without the backslashes and outer double quotes?

此 PostgreSQL 代码:

do
$j$
declare arr text[];

begin

arr = array_append(arr, jsonb_build_object('k', 'acg', 'v', 'val')::text);
arr = array_append(arr, jsonb_build_object('k', 'xyz', 'v', 'xxx')::text);

raise info '%', (array_to_json(arr));
end;
$j$

生成这个:

["{\"k\": \"acg\", \"v\": \"val\"}","{\"k\": \"xyz\", \"v\": \"xxx\"}"]

我知道我可以 运行 regexp_replace 并清理它,但是没有办法生成干净的 JSON 吗?

像这样?:

[{"k": "acg", "v": "val"},{"k": "xyz", "v": "xxx"}]

您看到的额外字符不是值的一部分,只是显示形式的一部分。

Generates this:

["{\"k\": \"acg\", \"v\": \"val\"}","{\"k\": \"xyz\", \"v\": \"xxx\"}"]

这是一个包含两项的数组(的输出表示);每个项目都是一个 JSON 字符串。这就是您的代码所要求的:

arr = array_append(arr, jsonb_build_object('k', 'acg', 'v', 'val')::text);
arr = array_append(arr, jsonb_build_object('k', 'xyz', 'v', 'xxx')::text);

如果您要使用 JSON,您肯定希望它作为您获得的文本字符串。

当然,该字符串的表示需要对特殊字符进行转义,以明确哪些字符是字符串的一部分,哪些不是。

值为 {"k": "acg", "v": "val"} 的文本字符串值将 表示以供显示 ,其中一些字符用反斜杠转义 "{\"k\": \"acg\", \"v\": \"val\"}"。反斜杠和周围的引号以及其他额外字符不是值的一部分。

因此您需要在呈现之间选择将值显示为PostgreSQL文字值,这需要转义其特殊字符以进行输出;或 使用 其他地方的文本字符串(例如,将值传递给另一个函数)作为实际值。

我认为您不打算在这里使用 text,而是想要 jsonb

代码将如下所示:

DO                                                                          
$j$                                                                         
DECLARE                                                                     
   arr jsonb[];                                                             
BEGIN                                                                       
   arr = array_append(arr, jsonb_build_object('k', 'acg', 'v', 'val'));     
   arr = array_append(arr, jsonb_build_object('k', 'xyz', 'v', 'xxx'));     

   RAISE NOTICE '%', to_jsonb(arr);                                         
END;                                                                        
$j$;

结果是:

NOTICE:  [{"k": "acg", "v": "val"}, {"k": "xyz", "v": "xxx"}]