python-3.x - 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 。
我该如何解析这个?
解决方案
在将此值传递给 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 ... ]
推荐阅读
- javascript - 从声明性 AccordionContainer 中删除子内容窗格
- ruby-on-rails - 如何将额外的上下文传递给 Pundit 范围?
- sql - Oracle查询连接两个表
- c# - 如何在任何给定时间查找登录到我的 ASP.NET Web 应用程序的用户
- git-bash - 获取/bin/bash:-c:第0行:寻找匹配的'''时出现意外的EOF
- reactjs - recharts中的实时图表
- sql - 无法根据我所需的输出编写 SQL 查询
- python - python中的Lambda函数语法
- list - 检查列表是否相等
- rest - 如何使用etcd v3 restful api观看