PostgreSQL неверный синтаксис ввода для типа json Входная строка неожиданно закончилась

#sql #json #postgresql

Вопрос:

Когда я пытаюсь импортировать файл JSON в PostgreSQL pgadmin, я написал следующий сценарий, но по какой-то причине он не работал с ошибкой, показанной ниже.

Sql/plpgsql:

 DROP TABLE IF EXISTS temp01;
DROP TABLE IF EXISTS temp_json;
create temp table temp01 (
    tmp text,
    tmp02 text,
    tmp03 text,
    tmp04 text
)
with (oids = false);

BEGIN;
create temporary table temp_json (values text) on commit drop;
copy temp_json from '/home/yuis/pg/psql/tmp03.json';

insert into temp01
select values->>'id' as tmp,
       values->>'created_at' as tmp02,
       values->>'username' as tmp03,
       values->>'tweet' as tmp04
    from (
        select replace(values,'','\')::json as values from temp_json 
    )
COMMIT;

SELECT * from temp01;
 

Вышеизложенное должно было привести к таблице примерно так:

 tmp|tmp02|tmp03|tmp04 
1396415271359897603,2021-05-23 19:38:39 JST,themooncarl,@elonmusk is still on our side.  t.co/K5DnByjzic
1396414423057711109,2021-05-23 19:35:17 JST,..(and so on)
 

Ошибка:

 ERROR:  invalid input syntax for type json
DETAIL:  The input string ended unexpectedly.
CONTEXT:  JSON data, line 1: 
SQL state: 22P02
 

Файл JSON, «tmp03.json»:

 {"id": 1396415271359897603, "conversation_id": "1396415271359897603", "created_at": "2021-05-23 19:38:39 JST", "date": "2021-05-23", "time": "19:38:39", "timezone": " 0900", "user_id": 978732571738755072, "username": "themooncarl", "name": "The Moon 🌙", "place": "", "tweet": "@elonmusk is still on our side.  t.co/K5DnByjzic", "language": "en", "mentions": [], "urls": [], "photos": ["https://pbs.twimg.com/media/E2EQSZgWQAELw9T.jpg"], "replies_count": 78, "retweets_count": 47, "likes_count": 570, "hashtags": [], "cashtags": [], "link": "https://twitter.com/TheMoonCarl/status/1396415271359897603", "retweet": false, "quote_url": "", "video": 1, "thumbnail": "https://pbs.twimg.com/media/E2EQSZgWQAELw9T.jpg", "near": "", "geo": "", "source": "", "user_rt_id": "", "user_rt": "", "retweet_id": "", "reply_to": [], "retweet_date": "", "translate": "", "trans_src": "", "trans_dest": ""}
{"id": 1396414423057711109, "conversation_id": "1396414423057711109", "created_at": "2021-05-23 19:35:17 JST", "date": "2021-05-23", "time": "19:35:17", "timezone": " 0900", "user_id": 978732571738755072, "username": "themooncarl", "name": "The Moon 🌙", "place": "", "tweet": "Me watching Bitcoin go down but realizing that it’s just a nice opportunity to buy more for cheap.  t.co/GkmSEPmJCh", "language": "en", "mentions": [], "urls": [], "photos": ["https://pbs.twimg.com/media/E2EPg4ZXMAMIXjJ.jpg"], "replies_count": 94, "retweets_count": 34, "likes_count": 771, "hashtags": [], "cashtags": [], "link": "https://twitter.com/TheMoonCarl/status/1396414423057711109", "retweet": false, "quote_url": "", "video": 1, "thumbnail": "https://pbs.twimg.com/media/E2EPg4ZXMAMIXjJ.jpg", "near": "", "geo": "", "source": "", "user_rt_id": "", "user_rt": "", "retweet_id": "", "reply_to": [], "retweet_date": "", "translate": "", "trans_src": "", "trans_dest": ""}
{"id": 1396388111840645120, "conversation_id": "1396388111840645120", "created_at": "2021-05-23 17:50:44 JST", "date": "2021-05-23", "time": "17:50:44", "timezone": " 0900", "user_id": 978732571738755072, "username": "themooncarl", "name": "The Moon 🌙", "place": "", "tweet": "HODL!!! 💪", "language": "cs", "mentions": [], "urls": [], "photos": [], "replies_count": 263, "retweets_count": 149, "likes_count": 2299, "hashtags": [], "cashtags": [], "link": "https://twitter.com/TheMoonCarl/status/1396388111840645120", "retweet": false, "quote_url": "", "video": 0, "thumbnail": "", "near": "", "geo": "", "source": "", "user_rt_id": "", "user_rt": "", "retweet_id": "", "reply_to": [], "retweet_date": "", "translate": "", "trans_src": "", "trans_dest": ""}
 

В то время как выше показана ошибка «недопустимый синтаксис ввода для типа json», приведенная ниже, с более простым образцом JSON, который я нашел в сообщении SO, это успешно без синтаксической ошибки.

 DROP TABLE IF EXISTS temp01;
DROP TABLE IF EXISTS temp_json;
create temp table temp01 (
    tmp text,
    tmp02 text,
    tmp03 text,
    tmp04 text
)
with (oids = false);

BEGIN;
create temporary table temp_json (values text) on commit drop;
-- copy temp_json from '/home/yuis/pg/psql/tmp03.json';
copy temp_json from '/home/yuis/pg/psql/tmp.json';

insert into temp01
-- select values->>'id' as tmp,
--        values->>'created_at' as tmp02,
--     values->>'username' as tmp03,
--     values->>'tweet' as tmp04
select values->>'id' as tmp,
    values->>'name' as tmp02,
    values->>'comment' as tmp03
    from (
        select replace(values,'','\')::json as values from temp_json
    )
COMMIT;

SELECT * from temp01;
 

JSON, «tmp.json»:

 {"id": 23635,"name": "Jerry Green","comment": "Imported from facebook."}
{"id": 23636,"name": "John Wayne","comment": "Imported from facebook."}
 

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_fa9740cb-905e-4c24-b763-7773bc9d1efe.png

Итак, по-видимому, проблема здесь связана с синтаксической ошибкой JSON, но, как вы можете видеть, в JSON нет синтаксической ошибки, по-видимому, проблема на стороне SQL.
Я понятия не имею, где в JSON и/или SQL что-то не так.

Комментарии:

1. Вырежьте и вставьте свой JSON в валидатор (например, jsonformatter.org ) Убедитесь, что он проверяется перед попыткой загрузки в SQL. Быстрый взгляд говорит мне, что поле идентификатора считается числовым, и это значение слишком велико для числа. Я предлагаю заключить это значение в кавычки и рассматривать как строку. Могут быть и другие ошибки…

2. Ваш код отлично работает для меня с файлом в текстовом формате «tmp03.json», который вы показали. Возможно, процесс копирования и вставки его в текстовое поле html устранил проблему

Ответ №1:

После некоторых попыток, как упоминал @jjanes, я обнаружил причину этой проблемы, это была пустая строка в конце файла json (tmp03.json).

Когда я скопировал и вставил в файл, используя «cat > файл», и я случайно нажал одну ненужную клавишу ввода в конце строк, это привело к созданию пустой строки в конце файла json. Итак, эта строка вызвала ошибку. вздыхать..

Вот несколько дополнительных попыток, которые я предпринял для дальнейшего понимания этой проблемы.

  • tmp05.json, строки json с удаленной последней «пустой» новой строкой

работал

  • tmp03.json, строки json с пустой строкой в последней (ошибка, упомянутая в вопросе)
 ERROR:  invalid input syntax for type json
DETAIL:  The input string ended unexpectedly.
CONTEXT:  JSON data, line 1:
SQL state: 22P02
 
  • tmp05_b.json, строки json, но только одна строка и никаких новых строк

например, так похоже

 {"a": "aa"}{"b": "bb"}{"c": "cc"}
 

скорее, чем

 {"a": "aa"}
{"b": "bb"}
{"c": "cc"}
 
 ERROR:  invalid input syntax for type json
DETAIL:  Expected end of input, but found "{".
CONTEXT:  JSON data, line 1: ...anslate": "", "trans_src": "", "trans_dest": ""}{...
SQL state: 22P02
 
  • tmp05_c.json, строки json, но удалите последнюю новую строку

удалена последняя пустая строка, а также рабочий файл tmp05.json, но также удалена последняя новая строка конца строк.

работал