将带有副本的有效json插入postgres表

Sid*_*Sid 11 postgresql json postgresql-9.3

有效的JSON自然可以有反斜杠字符:\.在SQL语句中插入数据时,如下所示:

sidharth=# create temp table foo(data json);
CREATE TABLE
sidharth=# insert into foo values( '{"foo":"bar", "bam": "{\"mary\": \"had a lamb\"}" }');
INSERT 0 1

sidharth=# select * from foo;

data                         
\-----------------------------------------------------

{"foo":"bar", "bam": "{\"mary\": \"had a lamb\"}" }
(1 row)
Run Code Online (Sandbox Code Playgroud)

事情很好.

但是,如果我将JSON复制到文件并运行复制命令,我得到:

sidharth=# \copy foo from './tests/foo' (format text); 


ERROR:  invalid input syntax for type json
DETAIL:  Token "mary" is invalid.
CONTEXT:  JSON data, line 1: {"foo":"bar", "bam": "{"mary...
COPY foo, line 1, column data: "{"foo":"bar", "bam": "{"mary": "had a lamb"}" }"
Run Code Online (Sandbox Code Playgroud)

好像postgres没有处理反斜杠.我认为因为http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html而且我被迫使用双反斜杠.这是有效的,即当文件内容是:

{"foo":"bar", "bam": "{\\"mary\\": \\"had a lamb\\"}" }  
Run Code Online (Sandbox Code Playgroud)

复制命令有效.但是期望对json数据类型进行特殊处理是正确的,因为上面的afterall不是有效的json.

小智 12

http://adpgtech.blogspot.ru/2014/09/importing-json-data.html

copy the_table(jsonfield) 
from '/path/to/jsondata' 
csv quote e'\x01' delimiter e'\x02';
Run Code Online (Sandbox Code Playgroud)

  • 在撰写本文时,这是OP问题的正确答案:如何从文件系统读取json*而无需应用特殊的转义语法(从而使json无效)。不幸的是,大多数用户会因为反对票和低 SO 代表而忽略答案。答案可能会更好,但这显然只是一个非 SO 用户的驾车经过...... (2认同)

Cra*_*ger 6

PostgreSQL的默认批量加载格式text是一个制表符分隔标记.它需要转义反斜杠,因为它们对于(例如)\Nnull占位符具有特殊含义.

观察PostgreSQL生成的内容:

regress=> COPY foo TO stdout;
{"foo":"bar", "bam": "{\\"mary\\": \\"had a lamb\\"}" }
Run Code Online (Sandbox Code Playgroud)

这根本不是json的特例,任何字符串都是如此.例如,考虑一个字符串 - 包括json - 可能包含嵌入的选项卡.必须逃脱这些以防止它们被视为另一个领域.

您需要生成正确转义的输入数据.与其尝试使用PostgreSQL特定text格式,通常更容易使用format csv和使用编写正确CSV的工具,并在编写时为您完成转义.