在PostgreSQL中,如何生成不带反斜杠和外部双引号的纯净JSON?

时间:2019-02-26 03:20:20

标签: json postgresql postgresql-9.6

此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"}]

2 个答案:

答案 0 :(得分:1)

您看到的多余字符不是值的一部分,仅是显示形式。

  

生成此:

["{\"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\"}"进行转义。反斜杠和引号以及其他多余字符不属于值。

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

答案 1 :(得分:0)

我认为您不打算在这里使用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$;

Te结果是:

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