如何用Python解码JSON?

如何用Python解码JSON?,python,json,python-3.x,decode,Python,Json,Python 3.x,Decode,我正在尝试用Python解码JSON。下面是JSON的一个小片段 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_ti

我正在尝试用Python解码JSON。下面是JSON的一个小片段

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"}
我正试图获得
start\u time\u delta
end\u time\u delta
并生成一个小散点图。但不知怎的,我无法解码JSON

以下是我的工作:

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

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

import json
r = http.request('GET', u)
json.loads(r.data.decode('utf-8'))

end = json.loads(r.data['end_time_delta'])
start = json.loads(r.data['start_time_delta'])
这就是我得到的错误:字节索引必须是整数或片,而不是str


为什么?我该如何解决这个问题呢?

您在这里忽略了
json.loads()
的返回值:

json.loads(r.data.decode('utf-8'))
然后再次尝试解码相同的原始数据,并尝试将其用作解码后的Python结果。调用
json.loads()
一次,并使用生成的Python字典:

result = json.loads(r.data.decode('utf-8'))
start = result['data'][0]['start_time_delta']
end = result['data'][0]['end_time_delta']
因为顶级字典
'data'
指向一个结果列表,所以我使用
0
获取第一个结果并提取所需的数据

如果需要为该列表中的每个字典提取这些数据点,则必须使用循环:

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

此处忽略了
json.loads()的返回值。

json.loads(r.data.decode('utf-8'))
然后再次尝试解码相同的原始数据,并尝试将其用作解码后的Python结果。调用
json.loads()
一次,并使用生成的Python字典:

result = json.loads(r.data.decode('utf-8'))
start = result['data'][0]['start_time_delta']
end = result['data'][0]['end_time_delta']
因为顶级字典
'data'
指向一个结果列表,所以我使用
0
获取第一个结果并提取所需的数据

如果需要为该列表中的每个字典提取这些数据点,则必须使用循环:

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

啊……我真是个傻瓜!非常感谢。我想我现在可以通过JSON从
0
循环到
n
?@Rachel:Python循环是foreach构造,当您可以直接访问序列中包含的元素时,无需使用索引。啊……我真是个傻瓜!非常感谢。我想现在可以将JSON从<代码> 0 循环到<代码> N< /代码>?@瑞秋:Python循环是前缀结构,当您可以直接访问序列中包含的元素时,不需要使用索引。也可以考虑使用该模块,它可以自动处理池,并提供一种非常简单的方法来解析请求返回的JSON。也可以考虑使用该模块,该模块自动处理池,并提供一种非常简单的方法来解析请求返回的JSON。