【问题标题】:Insert JSON into PostgreSQL that contains quotation marks将 JSON 插入包含引号的 PostgreSQL
【发布时间】:2017-07-09 13:47:04
【问题描述】:

我正在尝试将 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...

是否有任何额外的字符需要转义?

【问题讨论】:

    标签: json postgresql


    【解决方案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;
    

    【讨论】:

    • 我不认为我可以使用提到的直接转换。它给出了一个错误`错误:运算符不存在:文本->>未知第2行:值->>'注释'作为注释^提示:没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型转换。`
    • 它确实适用于from (select values::json from temp_json) a;
    • @ChrisStryczynski 查看我的示例:values::json-&gt;&gt;'annotations' “直接”是指“没有像 replace 这样的额外字符串处理”。
    • 如果我将临时表定义更改为 create temporary table temp_json (values jsonb) on commit drop; 它可以直接工作。对这个优雅的解决方案感到非常满意!
    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多