Rachel Rachel - 1 year ago 86
JSON Question

How to decode a JSON with Python?

I am trying to decode a JSON with Python. Here is a little snippet of what the JSON looks like.

b'{"success":true,"data":[{"id":26,"name":"A","comment":"","start_time_plan":null,"start_time_actual":"2016-09-13 00:00:00","start_time_delta":null,"start_time_score":null,"start_time_score_achievement":null,"start_time_traffic_light":null,"end_time_plan":null,"end_time_actual":"2016-09-13 00:00:00","end_time_delta":null,"end_time_score":null,"end_time_score_achievement":null,"end_time_traffic_light":null,"status":0,"measure_schedule_revision_id":63,"responsible_user_id":3,"created_time":"2016-09-13 11:29:14","created_user_id":3,"modified_time":"2016-09-21 16:33:41","modified_user_id":3,"model":"Activity"},{"id":27,"name":"B","comment":"","start_time_plan":null,"start_time_actual":"2016-09-13 00:00:00","start_time_delta":null,"start_time_score":null,"start_time_score_achievement":null,"start_time_traffic_light":null,"end_time_plan":null,"end_time_actual":"2016-09-13 00:00:00","end_time_delta":null,"end_time_score":null,"end_time_score_achievement":null,"end_time_traffic_light":null,"status":0,"measure_schedule_revision_id":63,"responsible_user_id":3,"created_time":"2016-09-13 11:29:48","created_user_id":3,"modified_time":"2016-10-16 18:14:36","modified_user_id":1,"model":"Activity"}

I am trying to get a hold of
and produce a little scatter plot. But somehow I can't decode the JSON.

Here is what I do:

#falcon api
u = 'https://myurl.com'

#urllib3 + poolmanager for requests
import urllib3
http = urllib3.PoolManager()

import json
r = http.request('GET', u)

end = json.loads(r.data['end_time_delta'])
start = json.loads(r.data['start_time_delta'])

This is the error I get: byte indices must be integers or slices, not str

How come? And how do I solve the problem?

Answer Source

You are ignoring the return value of json.loads() here:


You then try to decode the same raw again and try to use that as the decoded Python result. Call json.loads() once, and use the resulting Python dictionary:

result = json.loads(r.data.decode('utf-8'))
start = result['data'][0]['start_time_delta']
end = result['data'][0]['end_time_delta']

Because top-level dictionary 'data' key points to a list of results, I used 0 to get to the first of those and extract the data you want.

If you need to extract those data points for every dictionary in that list, you'd have to use a loop:

for entry in result['data']:
    start = entry['start_time_delta']
    end = entry['end_time_delta']
    # do something with these two values, before iterating to the next
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download