【问题标题】:Python - how can I iterate through JSON data with json.loadPython - 如何使用 json.load 遍历 JSON 数据
【发布时间】:2020-12-15 16:19:17
【问题描述】:

我有下面的 JSON,我用 json.load() 解析它

{
"participants": [
    {
        "name": "Joseph Bloggs"
    },
    {
        "name": "John Doe"
    }
],
"messages": [
    {
        "sender_name": "Joseph Bloggs",
        "timestamp_ms": 1606943360034,
        "content": "Hello John",
        "type": "Generic"
    },
    {
        "sender_name": "John Doe",
        "timestamp_ms": 1606943285176,
        "content": "Hi Joe",
        "type": "Generic"
    },

我尝试遍历消息以在每个值中搜索字符串。

import json 

data = json.load(f)
   
for msg in data['messages']:

    search = 'Jo'

    if search in str(msg['sender_name']) :
      print (msg['sender_name'])

这工作并为每个消息对象输出一个“Joe Bloggs”或“John Doe”字符串。

如果我尝试搜索 任何其他键、时间戳、内容、类型,我会得到一个 KeyError,例如尝试搜索参与者使用“Hello”一词的所有消息。

if search in str(msg['content']) :
          print (msg['content'])

导致关键错误:

in <module>
    if search in str(msg['content']) :
KeyError: 'content'

我想我不了解 json.load 和 Python 字典/列表。为什么 msg[sender_name] 有效但 msg[content] 无效?谢谢

【问题讨论】:

  • 所有邮件都有content 吗?
  • 请包含一个有效的 JSON 文件和产生您遇到的错误的可运行代码。很难按原样为您提供帮助,因为有很多事情可能会出错。
  • @DaniMesejo 不,不是所有的消息都有内容,现在我想想……

标签: python json


【解决方案1】:

我刚刚尝试了 .get('content') 并且成功了...

 search = 'Thing I am searching for'

    if search in str(msg.get('content')) :
        print (msg.get('content'))

如果有人能详细说明,我将不胜感激。我找到了解决方案,但我想了解“为什么”。 谢谢

【讨论】:

  • .get() 处理字典中没有 content 作为键的情况,如果需要,也可以将默认值传递给它,这在嵌套字典的情况下很方便
  • 您也可能需要小心 str() 方法,例如,如果您在 "one" 中搜索字符串,那么对于所有不匹配的值,您将得到 "None" -s as @987654323 @ 将是 "None",因此您可能希望将其默认为空 - msg.get('content', "")
【解决方案2】:

您可以使用字典上的 .get() 方法避免 KeyError

if search in str(msg.get('content')):
    print(str(msg.get('sender_name')))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2020-10-22
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多