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