22P02 错误:json 类型 -> 在 Postgres 中访问 JSON 的输入语法无效 [已关闭]

22P02 ERROR: invalid input syntax for type json -> Accessing JSON in Postgres [closed]

提问人:ChrisAsi71 提问时间:11/17/2023 更新时间:11/18/2023 访问量:40

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

6天前关闭。

我正在尝试查询JSON文件以提取字段并遇到问题。

这是我引用的 JSON 文件 14.Json

{"ChannelReadings": [
        { "ReadingsDto": [
                {
                    "Si": 47.67,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T12:57:43"
                },
                {
                    "Si": 47.22,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:02:43"
                },
                {
                    "Si": 47.6,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:07:43"
                },
                {
                    "Si": 47.5,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:12:43"
                }
            ],
            "ChannelId": 14
        },
        {
            "ReadingsDto": [
                {
                    "Si": 2.893605,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:07:43"
                }
            ],
            "ChannelId": 12
        },
        {
            "ReadingsDto": [
                {
                    "Si": 3.294233,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:07:43"
                }
            ],
            "ChannelId": 13
        },
        {
            "ReadingsDto": [
                {
                    "Si": 3.294233,
                    "Raw": 0,
                    "Conversion": 0,
                    "TimeStamp": "2023-01-24T13:07:43"
                }
            ],
            "ChannelId": 16
        }
    ],
    "DeviceSerialNumber": "894339",
    "RestartPointerNo": 5514732,
    "NewDownloadTable": false,
    "DataHashDto": "5Mckxoq42EeLHmLnimXv6A=="
}

我能够使用以下代码成功加载它

DROP TABLE IF EXISTS tmp;
CREATE TEMP  table tmp (c TEXT );
COPY tmp FROM 'C:\ChrisDev\Readings\14.json' WITH (FORMAT TEXT, DELIMITER '~');

当我运行以下代码时:

 select
             c::json ->> 'DeviceSerialNumber' as SerialNumber,
            (c::json ->> 'RestartPointerNo')::int as RestartPointerNo
 from tmp

我收到以下错误:

[2023-11-16 23:42:08] [22P02] ERROR: invalid input syntax for type json
[2023-11-16 23:42:08] Detail: The input string ended unexpectedly.
[2023-11-16 23:42:08] Where: JSON data, line 1: {"ChannelReadings": [

问题我需要在此处更改哪些内容才能提取 DeviceSerialNumber 和 RestartPointerNo 的值

json postgresql-16

评论

1赞 John Gordon 11/17/2023
我相信该命令期望 json 文件的每一行都是一个完整的独立 json 对象。但这不是文件的组织方式。COPY tmp FROM
0赞 ChrisAsi71 11/17/2023
@JohnGordon 是的,没错。当我从 tmp 运行 select * 时,JSON 的行在我的 Select 中显示为单独的行。因此,我需要在这里更改什么?
1赞 Nick 11/17/2023
您需要删除文件中每个 JSON 元素内的换行符。
0赞 ChrisAsi71 11/17/2023
@Nick好的,那么我是否删除了换行符的 [CR][LF]?

答:

-2赞 ChrisAsi71 11/17/2023 #1

因此,按照 Nick 给出的建议,我从输入文件中删除了所有 CR LF 代码,它奏效了!

评论

1赞 Kennedy Nyaga 11/17/2023
请将其添加为评论而不是答案。