这个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"}]
我认为你不打算在这里使用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"}]
您看到的额外字符不是值的一部分,只是显示表示的一部分。
生成这个:
["{\"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文字值,这需要转义其输出的特殊字符;或者在其他地方使用文本字符串(例如,将值传递给另一个函数)作为实际值。