有效的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)
事情很好。
但是如果我将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"}" }"
似乎postgres没有处理反斜杠。我认为因为http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html和 我被迫使用双反斜杠。这是有效的,即文件内容是:
{"foo":"bar", "bam": "{\\"mary\\": \\"had a lamb\\"}" }
复制命令有效。但是期望对json数据类型进行特殊处理是正确的 因为上面的afterall不是一个有效的json。
答案 0 :(得分:10)
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';
答案 1 :(得分:6)
PostgreSQL的默认批量加载格式text
是一个制表符分隔标记。它需要转义反斜杠,因为它们对于(例如)\N
null占位符具有特殊含义。
观察PostgreSQL生成的内容:
regress=> COPY foo TO stdout;
{"foo":"bar", "bam": "{\\"mary\\": \\"had a lamb\\"}" }
这根本不是json的特例,任何字符串都是如此。例如,考虑一个字符串 - 包括json - 可能包含嵌入的选项卡。那些必须逃脱,以防止他们被视为另一个领域。
您需要生成正确转义的输入数据。使用text
并使用编写正确CSV的工具通常更容易使用PostgreSQL特定的format csv
格式,而不是在写作时为您完成转义。