有效的 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 数据类型提供特殊处理是否正确,毕竟上面不是有效的 JSON。