將表格輸出為格式正確的縮進 JSON
我有一張桌子
dictionary
,它的結構是:create table dictionary ( id integer, first_level_key character varying(50), key_name character varying(50), key_value_en character varying(1000), key_value_fr character varying(1000) );
我想將此表輸出為格式良好的縮進 JSON。
我嘗試了以下查詢:
COPY (select (select row_to_json(_) from (select c.first_level_key) as _) as first_last, c.key_name,c.key_name_value_en from dictionary as c) TO '/tmp/label_en.json';
我得到了 JSON 輸出,但格式不正確,如下所示。
{"first_level_key":"topheader"} screen Screen Reader Access {"first_level_key":"header"} title {"first_level_key":"header"} subtitle {"first_level_key":"nav"} about About
我想要的輸出是格式良好的縮進 JSON,如下所示!
{ "topheader":{ "screen":"Screen Reader Access" }, "header":{ "title":"title", "subtitle":"subtitletest" }, "nav":{ "about":"About" }}
在重新閱讀文件時,我注意到雖然
pretty_bool
for 的選項JSON
沒有縮進選項,但有一個jsonb_pretty(from_json jsonb)
函式確實會生成縮進文本 (Returns from_json as indented JSON text.
),看起來就像您正在尋找的一樣。當您有一個“普通”表(我在問題中使用您的 DDL 作為我的模板)時,您要做的就是首先將其轉換為
JSON
使用ROW_TO_JSON
函式(文件),但正如這里和其他地方所討論的,這只轉換錶以JSON
逐行為基礎。函式(此處的JSONB_AGG
文件))。aggregates values, including nulls, as a JSON array
難題的最後一塊是
JSONB_PRETTY
(上面討論過的)函式,它使用原始查詢作為查詢的內部循環來獲取JSON
生成和輸出的縮進文本。JSON
Fiddle 可在此處獲得(所有 DDL 和 DML 都在此答案的底部)。
SELECT JSONB_PRETTY(JSONB_AGG(tab)) AS i_json FROM ( SELECT ( SELECT ROW_TO_JSON(x) FROM ( SELECT c.first_level_key) AS x ) AS first_last, c.key_name, c.key_value_en FROM dictionary AS c ) AS tab;
範例輸出(此答案末尾的整個表格):
[ { "key_name": "ttttttt", "first_last": { "first_level_key": "afasaffasa" }, "key_value_en": "zxccc" },
我相信這是(終於!)正確答案!
提出問題時,請始終提供您的版本 - 這對於提供答案非常重要。
DDL 和 DML(也在小提琴上):
創建表。請注意,我使用
TEXT
數據類型而不是VARCHAR(n)
出於此處和此處討論的原因。CREATE TABLE dictionary ( id INTEGER, first_level_key TEXT, key_name TEXT, key_value_en TEXT, key_value_fr TEXT );
填充它:
INSERT INTO dictionary VALUES (4, 'afasaffasa', 'ttttttt', 'zxccc', 'zzzzzzz'), (4, 'afasawweww', 'rrrrrrr', 'zxccc', 'zzzzzzz'), (4, 'afayyyyyyy', 'eeeeeee', 'zxccc', 'zzzzzzz'), (4, 'xxxxxxxxxx', 'wwwwwww', 'zxccc', 'zzzzzzz'), (4, 'mmmmmmmmmm', 'qqqqqqq', 'zxccc', 'zzzzzzz');
執行查詢:
SELECT JSONB_PRETTY(JSONB_AGG(tab)) AS i_json FROM ( SELECT ( SELECT ROW_TO_JSON(x) FROM ( SELECT c.first_level_key) AS x ) AS first_last, c.key_name, c.key_value_en FROM dictionary AS c ) AS tab;
結果:
i_json [ { "key_name": "ttttttt", "first_last": { "first_level_key": "afasaffasa" }, "key_value_en": "zxccc" }, { "key_name": "rrrrrrr", "first_last": { "first_level_key": "afasawweww" }, "key_value_en": "zxccc" }, { "key_name": "eeeeeee", "first_last": { "first_level_key": "afayyyyyyy" }, "key_value_en": "zxccc" }, { "key_name": "wwwwwww", "first_last": { "first_level_key": "xxxxxxxxxx" }, "key_value_en": "zxccc" }, { "key_name": "qqqqqqq", "first_last": { "first_level_key": "mmmmmmmmmm" }, "key_value_en": "zxccc" } ]
我想要的輸出是格式良好的縮進 JSON
- 格式良好的JSON 是您從已經在使用的函式中獲得的,我的意思是“一些文本”,它在語法上作為JSON 有效。
- 縮進的 JSON 是“漂亮”且易於閱讀的東西。
我不得不問為什麼你覺得需要後者?
JSON 是一種數據傳輸介質。因此,我不希望“普通”使用者直接與其互動,那麼為什麼任何 JSON 數據都需要“膨脹”,包含格式本身沒有用
的所有冗餘和處理耗時的空白為了?