将JSON插入包含引号的PostgreSQL

时间:2017-07-09 13:47:05

标签: json postgresql

我试图将JSON文件导入表格。我使用此处提到的解决方案:https://stackoverflow.com/a/33130304/1663462

create temporary table temp_json (values text) on commit drop;
copy temp_json from 'data.json';

select
  values->>'annotations' as annotationstext

from   (
           select json_array_elements(replace(values,'\','\\')::json) as values
           from   temp_json
       ) a;

Json文件内容是:

{"annotations": "<?xml version=\"1.0\"?>"}

我已经确认这是一个有效的JSON文件。

json文件包含一个\",我认为该错误导致以下错误:

CREATE TABLE
COPY 1
psql:insertJson2.sql:13: ERROR:  invalid input syntax for type json
DETAIL:  Expected "," or "}", but found "1.0".
CONTEXT:  JSON data, line 1: {"annotations": "<?xml version="1.0...

是否还有其他需要转义的字符?

1 个答案:

答案 0 :(得分:1)

因为copy命令处理文本格式的转义('\')字符而没有任何选项,所以有两种方法可以导入这些数据。

1)通过copy ... from program使用外部实用程序处理文件,例如使用sed

copy temp_json from program 'sed -e ''s/\\/\\\\/g'' data.json';

它会将所有反斜杠替换为加倍的反斜杠,它将被copy转换回单个反斜杠。

2)使用csv导入:

copy temp_json from 'data.json' with (format csv, quote '|', delimiter E'\t');

在这里,您应该设置quotedelimiter字符,使其不会出现在您的文件中的任何位置。

之后只需使用直接转换:

select values::json->>'annotations' as annotationstext from temp_json;