【问题标题】:Parsing data from JSON file using Python使用 Python 从 JSON 文件中解析数据
【发布时间】:2015-02-25 08:17:55
【问题描述】:

我有一个如下的 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 来执行此操作,但它只会引发错误。以下是代码的 sn-p 以及我尝试过的内容

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 代替。

谢谢。

【问题讨论】:

  • 这不是 JSON,而是 Python 字典。
  • 使用json.loads 时遇到什么错误?
  • TypeError: 预期的字符串或缓冲区

标签: python json parsing


【解决方案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'******'}]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这已经是一个 Python 字典了。它不是 JSON,不需要加载它。

      【讨论】:

      • 既然它不是 JSON,我如何从中提取我想要的值?
      猜你喜欢
      • 1970-01-01
      • 2017-04-03
      • 2023-04-02
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      相关资源
      最近更新 更多