Ron Arevalo
Ron Arevalo

Reputation: 19

Access JSON data from API

I am trying to write a script to download images from an API, I have a set up a loop that is as follows:

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

The print(pythonVal) returns:

 {
  "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",

I keep getting an error that reads:

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

For the pythonVal variable, if I just have it set to json.loads(json_data), it prints out the JSON response, but then when I try doing pythonVal['data'] I get another error that reads:

TypeError: string indices must be integers

Ultimately I'd like to be able to get data from it by doing something like

 pythonVal['data']['_embedded']['uploader']['username'] 

Thanks for your input!

Upvotes: 1

Views: 69

Answers (2)

Moinuddin Quadri
Moinuddin Quadri

Reputation: 48120

Why doing json.loads() twice? Change:

json.loads(json.loads(json_data))

to:

json.loads(json_data)

and it should work.

Now since you are getting error TypeError: string indices must be integers on doing pythonVal['data'], it means that the value of pythonVal is of list type and not dict. Instead do:

for item in pythonVal:
    print item

Please also mention the sample JSON content with the question, if you want better help from others :)

Upvotes: 1

sagar
sagar

Reputation: 811

Put the following on top of your code. This works by overriding the native ascii encoding of Python to UTF-8.

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

The second error is because you have already gotten the string, and you need integer indices to get the characters of the string.

Upvotes: 0

Related Questions