我有一个JSON文件输出如下
{
u'_embedded': {
u'workouts': [
{
u'start_datetime': u'2015-02-16T08:47:00+00:00',
u'name': u'Walk',
u'updated_datetime': u'2015-02-16T19:20:36+00:00',
u'created_datetime': u'2015-02-16T19:20:36+00:00',
u'notes': u'',
u'reference_key': None,
u'start_locale_timezone': u'Europe/London',
u'source': None,
u'_links': {
u'user': [
{
u'href': u'/v7.1/user/******/',
u'id': u'******'
}
],
u'self': [
{
u'href': u'/v7.1/workout/*******/',
u'id': u'*******'
}
],
u'privacy': [
{
u'href': u'/v7.1/privacy_option/1/',
u'id': u'1'
}
],
u'route': [
{
u'href': u'/v7.1/route/*******/',
u'id': u'*******'
}
],
u'activity_type': [
{
u'href': u'/v7.1/activity_type/9/',
u'id': u'9'
}
]
},
u'has_time_series': False,
u'is_verified': False,
u'aggregates': {
u'active_time_total': 1020.0,
u'elapsed_time_total': 1020.0,
u'distance_total': 1729.99651968,
u'speed_avg': 1.6972231232,
u'steps_total': 0.0
}
}
]
},
u'_links': {
u'self': [
{
u'href': u'/v7.1/workout/?limit=20&user=******&offset=0'
}
],
u'documentation': [
{
u'href': u'https://developer.underarmour.com/docs/v71_Workout'
}
]
},
u'total_count': 1
}
从这段代码中,我希望自己拉出训练ID,这是在
中u'user': [
{
u'href': u'/v7.1/user/******/',
u'id': u'******'
}
我使用json.loads在另一段代码中管理它,虽然在下面的代码中,我不知道如何实现它所以我可以使用json.loads而不是x.json()作为我我正在使用,所以我迷路了。我试图这样做,因为我会使用索引使用json.loads,但它只是抛出一个错误。下面是代码片段和我尝试过的内容
route = requests.get(url='https://oauth2-api.mapmyapi.com/v7.1/workout/?user=********', verify=False,
headers={'api-key': CLIENT_ID, 'authorization': 'Bearer %s' % access_token['access_token']})
route = route.json()
for info in route['workouts']['self']:
print info['id']
#print route
如何从JSON中提取数据的任何帮助都将非常受欢迎,或者如何编辑我的代码以允许我使用json.loads。
感谢。
答案 0 :(得分:1)
那不是JSON。它是一本Python字典。你看到了:字符串和u'blah blah'
的单引号?那不是JSON。它们是python对象表示。
使用ast.literal_eval
解析从字符串到python对象的所有内容。
>>> import ast
>>> with open('input') as f:
... obj = ast.literal_eval(f.read())
...
>>> obj
{u'_links': ......... } #Your entire object appears here.
>>> for item in obj["_embedded"]["workouts"]:
... print item["_links"]["user"]
...
[{u'href': u'/v7.1/user/******/', u'id': u'******'}]
答案 1 :(得分:0)
这已经是Python的一个词。它不是JSON,也不需要加载它。
答案 2 :(得分:0)
因为它是一个python dict对象,所以使用正确的键来获取值。 从你提供的字典中,如果字典是d。
itm = d.get(u'_embedded').get(u'workouts')[0]
是的,
{u'_links': {u'activity_type': [{u'href': u'/v7.1/activity_type/9/',
u'id': u'9'}],
u'privacy': [{u'href': u'/v7.1/privacy_option/1/', u'id': u'1'}],
u'route': [{u'href': u'/v7.1/route/*******/', u'id': u'*******'}],
u'self': [{u'href': u'/v7.1/workout/*******/', u'id': u'*******'}],
u'user': [{u'href': u'/v7.1/user/******/', u'id': u'******'}]},
u'aggregates': {u'active_time_total': 1020.0,
u'distance_total': 1729.99651968,
u'elapsed_time_total': 1020.0,
u'speed_avg': 1.6972231232,
u'steps_total': 0.0},
u'created_datetime': u'2015-02-16T19:20:36+00:00',
u'has_time_series': False,
u'is_verified': False,
u'name': u'Walk',
u'notes': u'',
u'reference_key': None,
u'source': None,
u'start_datetime': u'2015-02-16T08:47:00+00:00',
u'start_locale_timezone': u'Europe/London',
u'updated_datetime': u'2015-02-16T19:20:36+00:00'}
获取用户信息:
print itm.get(u'_links').get(u'user')
[{u'href': u'/v7.1/user/******/', u'id': u'******'}]
现在获取ID:
print itm.get(u'_links').get(u'user')[0].get(u'id')
******
您可以迭代列表而不是使用索引值。