使用 Python 从 JSON 文件中解析数据

Parsing data from JSON file using Python

我有一个 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 的任何帮助都将不胜感激。

谢谢。

那已经是 Python 字典了。不是JSON不需要加载

那不是 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'******'}]

由于它是一个 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')
******

您可以遍历列表而不是使用索引值。