有一个讨论,始于2016 年,关于jsonb_compact()
解决问题的功能......但是,这可能需要数年(!)。
漂亮的解决方案
(这个问题和另一个问题的真正解决方案)
我们必须同意 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"}
基本原理
JSON 标准,RFC 8259说“......在六个结构字符中的任何一个之前或之后都允许有无关紧要的空格”。换句话说,从jsonb
数据类型到text
的转换没有规范形式。PostgreSQL 强制转换约定(使用空格)是任意的。
许多应用程序需要最小化大的 JSONb 输出。两个典型的:最小化保存的大 JSONb 的文件大小pg_file_write()
;在 REST 接口中在线输出。
PostgreSQL 团队必须欣赏真正的 CAST 过程,而不是解析器,而是从 JSONb 内部表示的直接文本生成。
- 解决方法——从“JSON 文本”中删除空格——不是一项简单的任务,它需要一个好的解析器来避免篡改内容。解决方案是解析器,它不是正则表达式的解决方法……而在如今,内置解析器是
json_strip_nulls()
,甚至作为“偶然行为”解析器。