从API访问JSON数据

时间:2016-10-06 19:51:17

标签: python json

我正在尝试编写一个脚本来从API下载图像,我设置了一个循环,如下所示:

    response = requests.get(url, params=query)
    json_data = json.dumps(response.text)
    pythonVal = json.loads(json.loads(json_data))
    print(pythonVal)

print(pythonVal)返回:

 {
  "metadata": {
    "code": 200,
    "message": "OK",
    "version": "v2.0"
  },
  "data": {
  "_links": {
    "self": {
      "href": "redactedLink"
    }
  },
  "id": "123456789",
  "_fixed": true
    ,
  "type": "IMAGE",
  "source": "social media",
  "source_id": "1234567890_1234567890",
  "original_source": "link",
  "caption": "caption",
  "video_url": null,
    "share_url": "link",
    "date_submitted": "2016-07-11T09:34:35+00:00",
  "date_published": "2016-09-11T16:30:26+00:00",

我一直收到错误消息:

UnicodeEncodeError: 'ascii' codec can't encode character '\xc4' in
position 527: ordinal not in range(128)

对于pythonVal变量,如果我将它设置为json.loads(json_data),它会打印出JSON响应,但是当我尝试pythonVal['data']时,我会收到另一个错误:

TypeError: string indices must be integers

最终,我希望能够通过执行类似

的操作从中获取数据
 pythonVal['data']['_embedded']['uploader']['username'] 

感谢您的投入!

2 个答案:

答案 0 :(得分:1)

为什么要json.loads()两次?变化:

json.loads(json.loads(json_data))

为:

json.loads(json_data)

它应该有用。

现在,由于您在执行TypeError: string indices must be integers时收到错误pythonVal['data'],这意味着pythonVal的值属于list类型,而不是dict。而是做:

for item in pythonVal:
    print item

如果您想获得其他人更好的帮助,请同时提及问题的示例JSON内容:)

答案 1 :(得分:0)

将以下内容放在代码之上。这可以通过将Python的原生ascii编码覆盖为UTF-8来实现。

# -*- coding: utf-8 -*-

第二个错误是因为你已经获得了字符串,并且需要整数索引来获取字符串的字符。