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

将JSONB转换为缩小(无空格)字符串,json,string,postgresql,select,jsonb,Json,String,Postgresql,Select,Jsonb,如果我将{a:b}这样的文本值转换为JSONB,然后再转换回文本,则在:和之间添加一个空格 如何将文本转换为jsonb,这样我就可以使用jsonb函数,并返回到文本来存储它?根据您的问题和注释的措辞,看起来您确实需要替换 我们需要使搜索尽可能具体,以避免混淆json负载中可能嵌入的“:”,因此匹配周围的双引号似乎也更安全,例如: replace('{"a":"b"}'::jsonb::text, '": "', '":"') 从文档中: 由于json类型存储输入文本的精确副本,因此它将保留标记

如果我将{a:b}这样的文本值转换为JSONB,然后再转换回文本,则在:和之间添加一个空格


如何将文本转换为jsonb,这样我就可以使用jsonb函数,并返回到文本来存储它?

根据您的问题和注释的措辞,看起来您确实需要替换

我们需要使搜索尽可能具体,以避免混淆json负载中可能嵌入的“:”,因此匹配周围的双引号似乎也更安全,例如:

replace('{"a":"b"}'::jsonb::text, '": "', '":"')
从文档中:

由于json类型存储输入文本的精确副本,因此它将保留标记之间语义上无关紧要的空白,以及json对象中键的顺序。此外,如果值中的JSON对象多次包含同一个键,则保留所有键/值对。处理函数将最后一个值视为操作值。相反,jsonb不保留空白,不保留对象键的顺序,也不保留重复的对象键。如果在输入中指定了重复键,则只保留最后一个值

因此:

如果您想保持空白或缺少空白,请使用json。否则,您将在jsonb的输出上获得一个漂亮的打印版本。您可以在json类型上使用json函数/运算符,但不能使用jsonb运算符/函数。详情如下:

修改您的示例:

select '{"a":"b"}'::json::text;
   text    
-----------
 {"a":"b"}

你为什么认为空间是个问题?为什么要将JSON值存储为文本而不是jsonb?表中已经存在大量数据,它是一个通用列,所以有些值不是JSON,迁移不是一个选项。我想删除空格,因为这就是目前的情况,我不想改变行为,也不想保存空格,那么为什么要将其转换为json呢?只需直接存储“{a:b}”,而不需要像我说的那样进行转换,我想在存储数据之前使用json函数来更改数据,比如更新表集text_colunm=text_colunm::jsonb | |{key:newValues}“-”keyToRemove'::text那么空格有什么问题吗?的确,这在大多数情况下都可以使用,但我担心json值中可能会出现“:”。我希望找到一些json函数来解决这个问题,因为在转换成文本之后,没有办法知道值的一部分是什么,json格式的一部分是什么
create table json_test(fld_json json, fld_jsonb jsonb);
insert into json_test values('{"a":"b"}', '{"a":"b"}');
 select * from json_test ;
 fld_json  | fld_jsonb  
-----------+------------
 {"a":"b"} | {"a": "b"}
(1 row)
select '{"a":"b"}'::json::text;
   text    
-----------
 {"a":"b"}