【问题标题】:Navigating JSON in Python?在 Python 中导航 JSON?
【发布时间】:2015-07-07 13:51:12
【问题描述】:

回答: data["data"]["items"] 中的方括号表示字典列表。我原以为括号表示所有这些字典都是一个列表inside一个项目的列表(即[[item1,item2]])所以我不得不像这样调用一个0索引:数据[“数据”][“项目”][0]。那是不正确的,[0] 是不必要的,我真的应该知道,但没有意识到。


我正在使用 GAE,因此您可以将 self.response.write 语句视为 print

由于某种原因,尽管 user_xid 打印正确,但当我尝试在我的 for 循环中解析 json_data["data"]["items"][0] 时,解释器给了我错误,它似乎将 x 评估为 string,因为我收到一条错误消息,告诉我字符串索引必须是整数。

我没有意识到json_data["data"]["items"][0] 会产生一个字符串。我有点受阻。与使用json_data["data"]["items"][0] 而不是json_data["data"]["items"] 有什么关系吗?

我也尝试过json.loads(json_data["data"]["items"][0]),但无济于事。任何意见表示赞赏。

我有以下 JSON,为了便于阅读,我将其拆分了一下:

 {"meta":
    {"user_xid": "REDACTED", "message": "OK", "code": 200, "time": 1436273692},
"data":
    {"items": [

        {"time_completed": 1436193938, "xid": "4tLz2M3x8_E9mTPIQsQUdrj-83spikha", "title": "for 7h 40m", "time_created": 1436165067, "time_updated": 1436194828, "details":

            {"body": 0, "sound": 14348, "tz": "America/Vancouver", "awakenings": 1, "light": 13258, "mind": 0, "asleep_time": 1436165760, "awake": 1265, "rem": 0, "duration": 28871, "smart_alarm_fire": 1436193000, "quality": 81, "awake_time": 1436193600, "sunrise": 1436184840, "sunset": 1436156340},

        "date": 20150706, "shared": true, "sub_type": 0},

        {"time_completed": 1436135400, "xid": "4tLz2M3x8_Hk71lnuSLbeq4ascwJg-J8", "title": "for 25m", "time_created": 1436133600, "time_updated": 1436135590, "details":

             {"body": 0, "sound": 0, "tz": "America/Vancouver", "awakenings": 0, "light": 1500, "mind": 0, "asleep_time": 1436133600, "awake": 300, "rem": 0, "duration": 1800, "smart_alarm_fire": 0, "quality": 2, "awake_time": 1436134800, "sunrise": 0, "sunset": 0},

             "date": 20150705, "shared": true, "sub_type": 2},

        {"time_completed": 1436133497, "xid": "4tLz2M3x8_GIYf6G9_ZKH9xrKpuEzMjm", "title": "for 23m", "time_created": 1436131387, "time_updated": 1436135461, "details":

            {"body": 0, "sound": 1391, "tz": "America/Vancouver", "awakenings": 0, "light": 0, "mind": 0, "asleep_time": 1436132100, "awake": 719, "rem": 0, "duration": 2110, "smart_alarm_fire": 1436133445, "quality": 4, "awake_time": 1436133300, "sunrise": 0, "sunset": 0},

        "date": 20150705, "shared": true, "sub_type": 1},

        {"time_completed": 1436117080, "xid": "4tLz2M3x8_EUZyqCoXYOJO7Hfe92eSqg", "title": "for 26m","time_created": 1436115061, "time_updated": 1436121619, "details":

            {"body": 0, "sound": 480, "tz": "America/Vancouver", "awakenings": 0, "light": 1119, "mind": 0, "asleep_time": 1436115479, "awake": 420, "rem": 0, "duration": 2019, "smart_alarm_fire": 1436117069, "quality": 2, "awake_time": 1436116800, "sunrise": 1436098380, "sunset": 1436156280},

        "date": 20150705, "shared": true, "sub_type": 1}, 

        ],

        "links":
            {"next": "REDACTED"}, 

"size": 10}

}

我在 Python 中使用以下内容:

json_data = json.loads(user_data)
        self.response.write('<br><br>x_id: ' + json_data["meta"]["user_xid"])
        i = 0
        for x in json_data["data"]["items"][0]:
            duration = x['details']['duration']
            date = x["date"]
            self.response.write('<br><br>sleep number ' + str(i) + ' | duration: ' + str(duration) + ' | date: ' + str(date))
            i += 1

我正在使用 GAE,因此您可以将 self.response.write 语句视为 print

由于某种原因,尽管 user_xid 打印正确,但当我尝试在 for 循环中解析 json_data["data"]["items"][0] 时,解释器给了我错误,它似乎将 x 评估为 string,因为我收到一条错误消息,告诉我字符串索引必须是整数。

我没有意识到json_data["data"]["items"][0] 会产生一个字符串。我有点受阻。这与使用json_data["data"]["items"][0] 而不是json_data["data"]["items"] 有什么关系吗?

我也尝试过json.loads(json_data["data"]["items"][0]) 无济于事。任何意见表示赞赏。

谢谢!

【问题讨论】:

  • 为什么会被否决?

标签: python json google-app-engine


【解决方案1】:

做一些基本的调试和数据检查你会发现[0]的使用是不正确的

我很快加载了该数据并尝试了它

In [11]: for i in x['data']['items'][0]:
....:     print i
....:     
time_completed
xid
details
title
date
shared
sub_type
time_created
time_updated

这实际上是你得到的,但不是你所期望的。

那么发生了什么?如果您执行以下操作

x['data']['items'][0]
Out[28]: 
{'date': 20150706,
 'details': {'asleep_time': 1436165760,
  'awake': 1265,
  'awake_time': 1436193600,
  'awakenings': 1,
  'body': 0,
  'duration': 28871,
  'light': 13258,
  'mind': 0,
  'quality': 81,
  'rem': 0,
  'smart_alarm_fire': 1436193000,
  'sound': 14348,
  'sunrise': 1436184840,
  'sunset': 1436156340,
  'tz': 'America/Vancouver'},
 'shared': True,
 'sub_type': 0,
 'time_completed': 1436193938,
 'time_created': 1436165067,
 'time_updated': 1436194828,
 'title': 'for 7h 40m',
 'xid': '4tLz2M3x8_E9mTPIQsQUdrj-83spikha'}

结果如你所愿。

答案是因为你试图迭代x['data']['items'][0]

当您遍历字典时,默认情况下您将获得键而不是值。因此你得到了意想不到的字符串。

以下代码将为您提供您想要的。

In [30]: for i in x['data']['items']:
            print i['details']['duration']
   ....:     
   28871
   1800
   2110
   2019

这会遍历项目列表中的每个项目(字典)。

我认为投反对票是由于发布了大量代码,并且没有基本调试的真实证据。

【讨论】:

  • 谢谢!我一直在尝试调试这个,但我是一个相当大的新手。
  • 太好了,我试过了,效果很好。我以前没有真正使用过 JSON,我确实尝试将它加载到解释器中以测试数据,但我实际上无法弄清楚如何做到这一点(我对这些东西很陌生)。 json_data["data"]["item"] 产生字典列表,其中每个字典中的第一个键是“time_completed”...... items 键内的方括号让我失望。再次感谢!
  • 没有问题。只是意识到问题与 json 无关,而是嵌套的字典和列表如何在 python 中工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多