0

问题不在于获取 TXT,因为它是

SELECT to_jsonb(file_get_contents('/tmp/test.json'))

返回的不是 JSON 对象,而是一个字符串......即使replace(txt,E'\n',' ')它不起作用。如何规范化并将字符串真正转换为 JSON?

PS:我正在使用 JSONb,它必须是 JSON 用于摄取。


笔记

json文件/tmp/test.json

[
    {
      "foo": "etc",
      "bar": "etc",
      "x": 123
    },
    {
      "foo": "aaa",
      "bar": "bbb",
      "x": 456
    }
]

我正在使用 UBUNTU 18 LTS、PostgreSQL v12 和 linux 标准 TXT 中的文件。终端命令file -i /tmp/test.json说这一切​​都很好,“text/plain; charset=utf-8”。

仅将全文加载到一个字段中(使用 COPY FROM 似乎不可能),PostgreSQL 很丑,但是这个功能已经过测试并且是可靠的:

CREATE EXTENSION PLpython3U;
CREATE or replace FUNCTION file_get_contents(p_file text) RETURNS text AS $$
   import os.path
   if not os.path.isfile(args[0]):
       return None
   with open(args[0],"r") as content_file:
       content = content_file.read()
   return content
$$ LANGUAGE PLpython3U;
4

2 回答 2

1

使用 postgresql,我将您的文件保存在我的/tmp目录中。

要读取文件,如果文件在您的 postgresql 服务器上,您可以使用pg_read_file().

为了模拟您的场景,我尝试了以下操作:

方法 1 ( json_array_elements_text):

SELECT JSON_ARRAY_ELEMENTS_TEXT(
       REPLACE(PG_READ_FILE('/tmp/teste.txt'), E'\n', '')::JSON);

这一系列功能与您使用的非常相似,除了pg_read_file读取服务器上的文件和json_array_elements_text.

结果是:

                  json_array_elements_text                  
------------------------------------------------------------
 {      "foo": "etc",      "bar": "etc",      "x": 123    }
 {      "foo": "aaa",      "bar": "bbb",      "x": 456    }
(2 rows)

方法 2 ( json_to_recordset):

select * from json_to_recordset(replace(pg_read_file('/tmp/teste.txt'), E'\n', '')::json) as ("foo" varchar, "bar" varchar, "x" int);
 foo | bar |  x  
-----+-----+-----
 etc | etc | 123
 aaa | bbb | 456
(2 rows)

结果与第一个示例相似,但在这种方法中,我们根据在原始 json 数据中找到的元素定义列

于 2019-12-03T19:27:59.920 回答
1

它已经是 JSON 格式了,你只需要转换它:

SELECT file_get_contents('/tmp/test.json')::jsonb

“to_json”的文档说

对于除数字、布尔值或空值之外的任何标量类型,将使用文本表示形式,使其成为有效的 json 或 jsonb 值。

换句话说,它执行了将文件转换为单个 JSON 值所需的转义和引用。不是 JSON 对象,只是一个值。所以“to_json”是这个工作的错误工具。

于 2019-12-03T20:32:36.630 回答