【问题标题】:What is json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)什么是 json.decoder.JSONDecodeError:期望值:第 1 行第 1 列(字符 0)
【发布时间】:2018-02-21 23:06:37
【问题描述】:

我正在请求人脸比较 API。您在哪里发送 2 张图片,如果它们是同一个人,它会返回这里是链接: Face++ API

在文档中,他们提到您可以这样请求:

curl -X POST "https://api-us.faceplusplus.com/facepp/v3/compare" \
-F "api_key=<api_key>" \
-F "api_secret=<api_secret>" \
-F "face_token1=c2fc0ad7c8da3af5a34b9c70ff764da0" \
-F "face_token2=ad248a809408b6320485ab4de13fe6a9"

这是我的代码:

result = json.loads(os.popen('curl -X POST "https://api-us.faceplusplus.com/facepp/v3/compare/api_key=myKey/api_secret=mySecret/https://us-mc-prod-asset.oss-us-west-1.aliyuncs.com/mc-official/scripts/demoScript/images/demo-pic33.jpg/https://us-mc-prod-asset.oss-us-west-1.aliyuncs.com/mc-official/scripts/demoScript/images/demo-pic39.jpg"').read())

但是当我运行它时,我得到了这个:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
Traceback (most recent call last):
  File "/Users/max/Desktop/Programming/Face/venv/face.py", line 15, in <module>
    result = json.loads(os.popen('curl -X POST "https://api-us.faceplusplus.com/facepp/v3/compare/api_key=myKey/api_secret=mySecret/https://us-mc-prod-asset.oss-us-west-1.aliyuncs.com/mc-official/scripts/demoScript/images/demo-pic33.jpg/https://us-mc-prod-asset.oss-us-west-1.aliyuncs.com/mc-official/scripts/demoScript/images/demo-pic39.jpg"').read())
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我尝试以另一种方式使用请求:

result = requests.get( "https://api-us.faceplusplus.com/facepp/v3/compare/api_key=myKey/api_secret=mySecret/https://us-mc-prod-asset.oss-us-west-1.aliyuncs.com/mc-official/scripts/demoScript/images/demo-pic33.jpg/https://us-mc-prod-asset.oss-us-west-1.aliyuncs.com/mc-official/scripts/demoScript/images/demo-pic39.jpg")

但是,我得到了这个:

<Response [404]>

【问题讨论】:

  • 这意味着解码 JSON 时出错,因为解析器不知道如何处理额外的数据。据推测,API 不会返回单个有效的 JSON 对象,但您必须查看实际下载的内容才能确定。
  • os.popen(' ... ').read() 调用的输出是什么?就像乔恩说的,我怀疑它不是 JSON
  • 谢谢大家。 @sam 我添加了 os.popen(..).read() 的输出

标签: python json api curl


【解决方案1】:

curl 命令格式错误,因此,您会收到错误 Could not resolve host: api_key=myKey 而不是有效的 JSON 返回数据。

但是,(不要偏离您的问题),我可以建议您使用类似requests(或urllib2,如果您必须使用标准python 库)来发送HTTP 请求。以你现在的方式调用 curl 会产生意想不到的结果,比如你现在正在处理的事情。

此外,requests 实际上有一个非常方便的json() 响应对象方法。这将使您的代码更清晰,更容易排除故障。这是文档中的一个示例:

http://docs.python-requests.org/en/master/user/quickstart/#json-response-content

【讨论】:

  • 非常感谢。据我了解,我可以在不需要提供 api 密钥和其他条目的情况下使用请求。此外,在提到的 api 文档中使用 'curl' 来获得结果。但我仍然尝试使用请求,结果是 未找到。感谢您的建议!
  • 别担心,您可以发布您的请求代码示例(当然是经过编辑的)吗?会尽力帮忙的。
  • 谢谢老兄,不胜感激!我添加了您可能需要的所有内容。
猜你喜欢
  • 2023-03-25
  • 2020-11-11
  • 2017-05-09
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多