Python — как я могу перебирать данные JSON с помощью json.load

#python #json

#python #json

Вопрос:

У меня есть приведенный ниже 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» для каждого объекта сообщения.

Если я попытаюсь выполнить поиск по любым другим ключам, метке времени, содержимому, типу, я получу ошибку ключа, например, пытаясь выполнить поиск по всем сообщениям, в которых участники используют слово «Привет».

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

приводит к ключевой ошибке:

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

Я думаю, что я что-то не понимаю в json.словари / списки загрузки и Python. Почему msg[имя_отправителя] работает, но не msg [содержимое]? Спасибо

Комментарии:

1. Все ли сообщения имеют a content ?

2. Пожалуйста, включите рабочий файл JSON и исполняемый код, который выдает ошибку, с которой вы столкнулись. Трудно помочь вам как есть, поскольку есть так много вещей, которые могут пойти не так.

3. @DaniMesejo Нет, не все сообщения имеют содержимое, теперь я думаю об этом…

Ответ №1:

Я только что попробовал .get(‘content’), и это сработало…

  search = 'Thing I am searching for'

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

Если кто-нибудь может уточнить, я был бы признателен. Я нашел решение, но я хотел бы понять «почему».
Спасибо

Комментарии:

1. .get() обрабатывает сценарии, когда у вас нет content ключа as в вашем словаре, вы также можете передать ему значение по умолчанию, если захотите, что удобно в случае вложенных dicts

2. также вы можете быть осторожны с методом str(), например, если вы ищете строку в «one», то для всех значений, не совпадающих с none, вы получите «None» -s, как str(msg.get('content')) будет "None" , поэтому вы можете захотеть по умолчанию использовать значение nothing вместо этого — msg.get('content', "")

Ответ №2:

Вы можете избежать KeyError с помощью метода .get() в словаре

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