解析来自URL的JSON并跳过Python的第一行

2exbekwf  于 2023-06-25  发布在  Python
关注(0)|答案(2)|浏览(132)

我有一个URL,其中包含一些JSON数据。我想解析这些数据并使用Python转换为字典。网页上的第一行数据不是JSON格式的,所以我想在解析前跳过第一行。网页上的数据如下所示:

expected 1 issue, got 1
{
  "Issues": [
    {
      "issue": {
        "assignedTo": {
          "iD": "2",
        },
        "count": "1117",
        "logger": "errors",
        "metadata": {
          "function": "_execute",
          "type": "IntegrityError",
          "value": "duplicate key value violates unique constraint \nDETAIL:  Key (id, date, reference)=(17, 2020-08-03, ZER) already exists.\n"
        },
        "stats": {},
        "status": "unresolved",
        "type": "error"
      },
      "Events": [
        {
          "message": "Unable to record details",
          "tags": {
            "environment": "worker",
            "handled": "yes",
            "level": "error",
            "logger": "errors",
            "mechanism": "logging",
          },
          "Messages": null,
          "Stacktraces": null,
          "Exceptions": null,
          "Requests": null,
          "Templates": null,
          "Users": null,
          "Breadcrumbs": null,
          "Context": null
        },
      ],
      "fetch_time": "2020-07-20"
    }
  ]
}

我试着运行这个脚本:

with urllib.request.urlopen("[my_url_here]") as url:
    if(url.getcode()==200):
        for _ in range(1):
            next(url)
        data = url.read()
        json=json.loads(data)
    else:
        print("Error receiving data", url.getcode())

但我遇到了错误:

Traceback (most recent call last):
  File "<stdin>", line 6, in <module>
  File 
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

当我运行它而不使用

for _ in range(2):
            next(url)

...但最后一行为“期望值:行2列1(char 1)'。
有什么建议吗?谢谢

qyzbxkaa

qyzbxkaa1#

你可以通过下面的代码删除第一行。
代码:

data = ''.join(data.split('\n')[1:])
print(data)

输出:

{  "Issues": [    {      "issue": {        "assignedTo": {          "iD": "2",          "name": "industry"        },        "count": "1117",        "logger": "errors",        "metadata": {          "function": "_execute",          "type": "IntegrityError",          "value": "duplicate key value violates unique constraint DETAIL:  Key (id, date, reference)=(17, 2020-08-03, ZER) already exists."        },        "stats": {},        "status": "unresolved",        "type": "error"      },      "Events": [        {          "message": "Unable to record contract details",          "tags": {            "environment": "worker",            "handled": "yes",            "level": "error",            "logger": "errors",            "mechanism": "logging",          },          "Messages": null,          "Stacktraces": null,          "Exceptions": null,          "Requests": null,          "Templates": null,          "Users": null,          "Breadcrumbs": null,          "Context": null        },      ],      "fetch_time": "2020-07-20"    }  ]}

正如你所看到的,我们实现了删除第一行。但是你的解析Json响应有问题。格式不正确。看看下面的图片。

在交叉线上我们得到了额外的逗号,让解析器知道还有更多的示例,但是您的响应在该范围内没有更多的示例。所以,请检查一下你的代码,用于将你的数据转换为json。如果你有疑问,请写在这里。为了验证json,可以检查https://jsonlint.com/
我希望这对你有帮助...:)

qzlgjiam

qzlgjiam2#

你可以尝试这样加载json:

json.loads(data.split("\n",1)[1])

这将在第一端线处分裂串并使用其第二部分。但是我不鼓励这样做,因为你不能确定你的服务器总是这样回复--如果可以的话,试着修复端点或者找到一个返回有效JSON回复的端点。
你仍然会得到一个json.decoder.JSONDecodeError: Invalid control character at: line 14 column 68 (char 336),因为数据中有\n

相关问题