Postgresql

如何使用 Postgresql 轉儲到 csv 有效的 json?

  • November 10, 2018

我正在嘗試將一些數據轉儲為 json:

\copy (SELECT json_build_object('areaSqft',area_sqft, 'titleNos',title_nos, 'buildingIds',building_ids, 'geometry',geom_json) FROM my_data) to my_data.csv with delimiter ',' csv header

我期望的是每行有效的 json,但我得到的是:

"{""areaSqft"": 214.394254595041, ""geometry"": {""type"": ""MultiPolygon"", ""coordinates"": [[[[0.000015, 51.449107], [0.000154, 51.441108], [0.000238, 51.44111], [0.00024, 51.441052], [0.000137, 51.441051], [0.000041, 51.441049], [0.000015, 51.441107]]]]}, ""titleNos"": [""ZB78669""], ""buildingIds"": [7521141, 9530393, 7530394]}"

有額外"的第一個和最後一個字元以及""周圍而不是 single "

如何獲得有效的 json 去除不必要的引號?

欄位和內部欄位的引號是 CSV 格式的一部分,在這裡它們是必需的,因為根據CSV 規範

  1. 包含換行符 (CRLF)、雙引號和逗號的欄位應該用雙引號括起來
  2. 如果使用雙引號將欄位括起來,則出現在欄位內的雙引號必須通過在其前面加上另一個雙引號來進行轉義

我認為您不需要或不需要 CSV。只取SELECT的輸出,unaligned格式為psql

=# \pset format unaligned 
Output format is unaligned.

=# select json_build_object('foo', 1, bar, 2) AS myjson
  from (values (E'xy\zt'), ('ab,cd')) as b(bar);

myjson
{"foo" : 1, "xyzt" : 2}
{"foo" : 1, "ab,cd" : 2}
(2 rows)

您也可以使用\g output.json而不是查詢末尾的分號讓 psql 將該查詢的結果重定向到文件,並\pset tuples_only刪除頁眉和頁腳。

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