代码之家  ›  专栏  ›  技术社区  ›  sds Niraj Rajbhandari

可以控制JSONB序列化吗?

  •  1
  • sds Niraj Rajbhandari  · 技术社区  · 6 年前

    我想出口一个 jsonb Postgres(v9.6)表中的列。

    我试过了 COPY 命令:

    \COPY (SELECT my_json_column FROM my_table) to 'data.json';
    

    我确实得到了一个JSON文件,但我想要两个修改:

    1. : , .
    2. 我想要一个统一的和可预测的密钥排序。

    换句话说,我想要Python的行为 json.dump 带参数

    1. separators=(',',':')
    2. sort_keys=True

    (这是摄取的文件的格式,我想以相同的格式导出它,以检查往返是否为identity。)

    2 回复  |  直到 6 年前
        1
  •  2
  •   klin    6 年前

    没有设置jsonb输出格式的内置选项。你可以用 PL/Python.

    create extension if not exists plpython3u;
    

    至于现在(Postgres 10),你必须使用 Abstract Syntax Trees 将postgresjsonb转换为Python对象(在将来的版本中可以自动转换)。

    create or replace function format_jsonb(obj jsonb)
    returns text language plpython3u as $$
        import json
        import ast
        js = ast.literal_eval(obj);
        return json.dumps(js, separators=(',', ':'), sort_keys=True)
    $$;
    

    用途:

    select format_jsonb('{"abcd": 1, "jklm": 2, "jkl": 3, "abc": 4}');
    
                format_jsonb             
    -------------------------------------
     {"abc":4,"abcd":1,"jkl":3,"jklm":2}
    (1 row)
    

    \COPY (SELECT format_jsonb(my_json_column) FROM my_table) to 'data.json';
    
        2
  •  0
  •   Laurenz Albe    6 年前

    如果要保留原始格式,请不要使用 jsonb . 使用 json

    如果你需要的话 jsonb公司 设施,把柱子 jsonb公司 在飞行中。您仍然可以提高效率,因为您可以添加如下索引

    CREATE INDEX ON mytab USING gin ((jsoncol::jsonb));