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