如何从PostgreSQL
中提取压缩的JSONB
?
我在取数时得到的都是空格:
SELECT data FROM a_table WHERE id = 1; -- data is JSONB column
{"unique": "bla bla", "foo": {"bar": {"in ...
^ ^ ^ ^ ^ --> spaces
我想要的是:
{"unique":"bla bla","foo":{"bar":{"in ...
3条答案
按热度按时间qni6mghb1#
json_strip_nulls()
完全可以满足您的需求:退货
但是
退货
这个函数不仅可以去除函数名中的空值和documented,还可以去除不重要的空格,后者在PostgreSQL手册中没有明确的说明。
在PostgreSQL 11.3中测试,但可能也适用于早期版本。
cu6pst1q2#
jsonb
在输出时以标准格式呈现。您必须改用json
来保留不重要白色。Per documentation:因为
json
类型存储了输入文本的精确副本,所以它将保留标记之间语义上无关紧要白色,以及JSON对象中键的顺序,而且,如果值中的JSON对象多次包含相同的键,则所有键/值对都将保留。(处理函数将最后一个值视为操作值。)相比之下,jsonb
不保留白色,不保留对象键的顺序,并且不保留重复的对象键。空格对于JSON值来说并不重要。
waxmsbnn3#
有一个discussion, started in 2016, about a function
jsonb_compact()
可以解决这个问题...但是,这可能需要几年的时间(!)。漂亮的解决方案
(这个问题和this other one的真实的解决方案)
我们必须同意PostgreSQL的
CAST(var_jsonb AS text)
转换约定。当你需要另一个转换约定时,例如调试或人类可读的输出,内置的jsonb_pretty()
函数是一个很好的选择。不幸的是,PostgreSQL没有提供其他选项,比如compact选项。因此,您可以使用
compact
选项重载jsonb_pretty()
:依据
jsonb
数据类型到text
的转换没有规范形式。PostgreSQL转换约定(使用空格)是任意的。*许多应用程序需要最小化大的JSONb输出。将大JSONb的文件大小最小化,节省
pg_file_write()
;在REST接口中在线输出。json_strip_nulls()
,甚至是“偶然行为”解析器。