Postgresql

將表格輸出為格式正確的縮進 JSON

  • March 6, 2020

我有一張桌子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_boolfor 的選項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 數據都需要“膨脹”,包含格式本身沒有用

的所有冗餘和處理耗時的空白為了?

引用自:https://dba.stackexchange.com/questions/260536