Estou tentando despejar alguns dados como json com:
\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
o que estou esperando é um json válido por linha, mas o que recebo é:
"{""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]}"
Existem extras "
como primeiro e último caractere e ""
ao redor em vez de único "
.
Como posso obter um json válido removendo aspas desnecessárias?
As aspas ao redor dos campos e dentro dos campos fazem parte do formato CSV e são obrigatórias aqui, pois, de acordo com a especificação CSV :
Eu acho que você não quer ou precisa de CSV no seu caso. Basta pegar a saída do SELECT, com o
unaligned
formato do psqlVocê também pode usar
\g output.json
em vez do ponto e vírgula no final da consulta para que o psql redirecione os resultados dessa consulta para um arquivo e\pset tuples_only
remova cabeçalhos e rodapés.Você pode simplesmente adicionar mais parâmetros à consulta:
Veja também:
Colocando isso aqui para referência futura, pois tive que lidar com uma coluna específica contendo JSON em um arquivo CSV (já) exportado.
Você pode se safar usando em suas opções de cópia para
FORMAT CSV
:QUOTE ''''
(usando o caractere de aspas simples em vez do padrão de aspas duplas)junto com
DELIMITER '|'
(ou qualquer outro que não a vírgula, para evitar ter que escapar de todas as vírgulas em seu JSON, que é propenso a erros e diminui a compatibilidade downstream quando você tenta usar o arquivo para carregar (copiar de))O problema para mim era, na verdade, que eu estava usando anteriormente
cursor.copy_to()
a biblioteca psycopg2 do Python e precisava substituí-lacursor.copy_expert()
para melhor/mais controle (citando/descitando os nomes das colunas passados). E aparentemente o método .copy_to usa aQUOTE ''''
opção sem que ela seja documentada em qualquer lugar que eu possa encontrar...