json - 将 JSONB 转换为缩小(无空格)字符串

标签 json string postgresql select jsonb

如果我将 {"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/

相关文章:

sql - 如何为表中的特定行获取最近的 n 行?

ruby-on-rails - 从 postgres db 接收 IP 地址的所有匹配网络

sql - 如何将格式传递给 postgresql 中的 to_timestamp?

java - 将 JSONObject 写入文件

json - Postgres 对 json 字段的全文搜索

java - 返回 2 个不同的字符串

c# - ar-sa 文化的预期日期时间字符串是什么?

javascript - 用jstree中的子树替换单个节点

java - lambda groupingBy 对象返回复杂的 JSON

java - 我可以改变我的字符串吗?