首页 > 解决方案 > 转换为 json 时 Postgres psql 输出文本换行

问题描述

我在 psql 中有一个奇怪的行为,它使长 base64 编码的文本在转换为 json 字符串时被换行符打破

我将我的文本编码为 base64,如下所示:

db=> select encode('-------------------------------------------------------------------'::bytea, 'base64');
                                    encode                                    
------------------------------------------------------------------------------
 LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t+
 LS0tLS0tLS0tLQ==

这里输出文本被包装,这实际上不是问题。但是,如果我使用以下命令将此 base64 编码文本转换为 json 字符串to_json()

db=> select to_json(encode('-------------------------------------------------------------------'::bytea, 'base64')::text);
                                             to_json                                              
--------------------------------------------------------------------------------------------------
 "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t\nLS0tLS0tLS0tLQ=="

这里 json 中的 base64 编码文本在\n结尾附近有一个换行符 ( ),这在解码时完全破坏了 base64 代码(感谢Laurenz Albe的更正!)。换行符稍后在我的程序中给我带来了麻烦,我正在寻找一种解决方案来在 psql 中修复它。

我尝试使用/pset format命令或设置PAGER="less -SF" psql ...(来自其他 stackoverflow 问题:禁用 Psql 输出中的包装)但没有成功。

我找到的唯一解决方案(也是一个非常肮脏的解决方案)是:

db=> select to_json(regexp_replace((select to_json(encode('----------------------------------------------------------'::bytea, 'base64')::text))::text, '(\\n|")', '', 'g'));
                                      to_json                                       
------------------------------------------------------------------------------------
 "LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ=="

在这里,我转换为 JSON 字符串(带to_json()),然后删除 JSON 字符串引号和换行符(带regexp_replace()),然后再次重新转换为 JSON 以获得预期结果。

标签: jsonpostgresqlbase64psqlword-wrap

解决方案


推荐阅读