使用Python从JSON文件解析数据

时间:2015-02-25 08:17:55

标签: python json parsing

我有一个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。

感谢。

3 个答案:

答案 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')
******

您可以迭代列表而不是使用索引值。