问题不是因为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;
答案 0 :(得分: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数据上的元素定义列
答案 1 :(得分:1)
它已经是JSON格式,您只需要强制转换即可:
SELECT file_get_contents('/tmp/test.json')::jsonb
“ to_json”文档说
对于除数字,布尔值或空值以外的任何标量类型, 文字表示形式将以 有效的json或jsonb值。
换句话说,它执行转义和引用操作,以将文件转换为单个JSON值。不是JSON对象,只有一个值。因此,“ to_json”是该工作的错误工具。