如果我将 {"a":"b"}
这样的文本值转换为 JSONB,然后再转换回文本,则会在 之间添加一个空格 (
和 ) >:
"
.
psql=> select '{"a":"b"}'::jsonb::text;
text
------------
{"a": "b"}
(1 row)
如何将文本转换为 jsonb,以便我可以使用 jsonb 函数,然后返回文本来存储它?
最佳答案
JSON 标准,RFC 8259 ,说“...在六个结构字符中的任何一个之前或之后允许存在无关紧要的空格”。换句话说,来自 jsonb
的 Actor 阵容至text
没有通用canonical form 。 PostgreSQL 转换约定(使用空格)是任意的。
因此,我们必须同意 PostgreSQL 的 CAST(var_jsonb AS text)
约定。当您需要另一个强制转换约定时,例如为了调试或人类可读的输出,内置 jsonb_pretty()
函数是一个不错的选择。
不幸的是,PostgreSQL 不提供其他选择,例如紧凑型选择。所以,你可以重载jsonb_pretty()
与 compact
选项:
CREATE or replace FUNCTION jsonb_pretty(
jsonb, -- input
compact boolean -- true for compact format
) RETURNS text AS $$
SELECT CASE
WHEN $2=true THEN json_strip_nulls($1::json)::text
ELSE jsonb_pretty($1)
END
$$ LANGUAGE SQL IMMUTABLE;
SELECT jsonb_pretty( jsonb_build_object('a',1, 'bla','bla bla'), true );
-- results {"a":1,"bla":"bla bla"}
查看完整的讨论 this similar question .
关于json - 将 JSONB 转换为缩小(无空格)字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62323991/