首页 > 解决方案 > Python3 Gerrit 请求获取响应 Json 以 )]} 开头

问题描述

我正在对 gerrit 服务器进行 REST 调用。非常直接的期望我不理解响应查看来自 Chrome 的网络流量,Chrome 得到相同的响应。所以我猜我根本不明白如何解析响应。这是我的代码和一些响应:

import requests
from requests.auth import HTTPBasicAuth

url = 'https://my.gerrit.server.com/changes/?n=1&q=owner=me'

headers = { 'Content-Type': 'application/json', 'charset' : 'UTF-8'}
response = requests.get(url, verify=False, auth=HTTPBasicAuth('usernmae', 'password'), headers=headers)

如果我们打印 response.text,我们会得到:

')]}\'\n[\n  {\n    "id": "some_id, ... ,\n    "requirements": []\n  }\n]\n'

除了开头)]}之外,它看起来都像有效的 JSON 。

我该如何解析这个?

标签: python-3.xpython-requestsgerrit

解决方案


在将此值传递给 JSON 解析器之前,您必须去除前缀字符。

s[4:] if s.startswith(')]}\'') else s
>>> s = ')]}\'\n[\n  {\n    "id": "some_id",\n    "requirements": []\n  }\n]\n'
>>> json.loads(s[4:] if s.startswith(')]}\'') else s)
[{'id': 'some_id', 'requirements': []}]

来自https://gerrit-review.googlesource.com/Documentation/rest-api.html#output上的 Gerrit 文档

为了防止跨站点脚本包含 (XSSI) 攻击,JSON 响应正文以魔术前缀行开头,在将响应正文的其余部分提供给 JSON 解析器之前必须删除该前缀行:

  )]}'
  [ ... valid JSON ... ]

推荐阅读