Как захватить эту вложенную строку в JSON с помощью PHP?

#php #json #parsing #associative-array

#php #json #синтаксический анализ #ассоциативный массив

Вопрос:

Я просматриваю тела электронной почты, которые представляют собой не что иное, как вывод JSON. Я пытаюсь захватить одну строку emailAddress , но я не уверен в синтаксисе. Я могу добраться до Message части JSON, но все остальное, к чему я пытаюсь получить доступ, я в конечном итоге получаю Illegal string offset .

Итак, если мой JSON:

  [Type] => Notification 
 [MessageId] => gibberishhere 
 [TopicArn] => arn:aws:somethingsomethingsomething 
 [Message] => {
   "notificationType":"Bounce",
   "bounce":{
     "feedbackId":"blahblahblahblahblah",
     "bounceType":"Permanent",
     "bounceSubType":"General",
     "bouncedRecipients":[{
       "emailAddress":"bounce@simulator.amazonses.com",
       "action":"failed",
       "status":"5.1.1",
       "diagnosticCode":"smtp; 550 5.1.1 user unknown"}],
     "timestamp":"2020-11-02T16:37:13.000Z",
     "remoteMtaIp":"ip.address.here",
     "reportingMTA":"dsn; somethingsomething"},
     "mail":{
       "timestamp":"2020-11-02T16:37:13.029Z",
       "source":"test@emailaddress.com",
       "sourceArn":"arn:somethingsomethingdotcom",
       "sourceIp":"ip.address.here",
       "sendingAccountId":"somethingsomething",
       "messageId":"numbersnumbersnumbers1234567890",
       "destination":["bounce@simulator.amazonses.com"]
       }
     } 
     [Timestamp] => 2020-11-02T16:37:13.677Z 
     [SignatureVersion] => 1 
     [Signature] => blahblahblah 
     [SigningCertURL] => blahblahblah 
     [UnsubscribeURL] => blahblahblah
  

И у меня есть это для ее декодирования:

 $message = json_decode($message, true);
echo $message['Message'];
  

Я получаю этот вывод:

 {
"notificationType":"Bounce",
"bounce":{
  "feedbackId":"blahblahblahblahblah",
  "bounceType":"Permanent",
  "bounceSubType":"General",
  "bouncedRecipients":[{
    "emailAddress":"bounce@simulator.amazonses.com", <---- I NEED THIS FIELD
    "action":"failed",
    "status":"5.1.1",
    "diagnosticCode":"smtp; 550 5.1.1 user unknown"}],
  "timestamp":"2020-11-02T16:37:13.000Z",
  "remoteMtaIp":"ip.address.here",
  "reportingMTA":"dsn; e226-55.smtp-out.us-east-2.amazonses.com"},
  "mail":{
    "timestamp":"2020-11-02T16:37:13.029Z",
    "source":"test@emailaddress.com",
    "sourceArn":"arn:somethingsomethingdotcom",
    "sourceIp":"ip.address.here",
    "sendingAccountId":"somethingsomething",
    "messageId":"numbersnumbers1234567890",
    "destination":["bounce@simulator.amazonses.com"]
    }
  }   
  

Все, что мне нужно, это emailAddress поле. Как далеко мне нужно зайти, чтобы захватить ее? Я пробовал

$message['Message']['bounce'] , $message['Message']['emailAddress'] , и несколько других, но все они возвращаются Illegal string offset .

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

1. Похоже, она была дважды закодирована. Попробуйте расшифровать сообщение: $arr = json_decode($message['Message'], true); . Тогда $arr должен быть обычный PHP-массив, из которого вы можете получить нужное вам значение.

2. Это немного помогло, но я получаю большой массив массивов.

3. Да, именно так выглядит структура данных. После ее декодирования вы должны иметь возможность получить доступ к значению с помощью: $arr['bounce']['bouncedRecipients'][0]['emailAddress'] . Проверьте, работает ли это.

Ответ №1:

Работа с ассоциативным массивом относительно проста, как предложено в комментарии:

 $arr = json_decode($message['Message'], true);
  

Теперь все, что вам нужно сделать, это сослаться на правильный элемент, следуйте по пути:

 echo $arr['bounce']['bouncedRecipients'][0]['emailAddress'];
  

Что дает:

 bounce@simulator.amazonses.com
  

РЕДАКТИРОВАТЬ: Как ссылаться на элемент emailAddress — объясните индекс [0]

Чтобы получить хорошее представление о структуре массива $arr , вы можете использовать:

 echo '<pre>';
print_r($arr);
echo '</pre>';
  

Какие результаты:

 Array
(
    [notificationType] => Bounce
    [bounce] => Array
        (
            [feedbackId] => blahblahblahblahblah
            [bounceType] => Permanent
            [bounceSubType] => General
            [bouncedRecipients] => Array
                (
                    [0] => Array
                        (
                            [emailAddress] => bounce@simulator.amazonses.com
                            [action] => failed
                            [status] => 5.1.1
                            [diagnosticCode] => smtp; 550 5.1.1 user unknown
                        )

                )

            [timestamp] => 2020-11-02T16:37:13.000Z
            [remoteMtaIp] => ip.address.here
            [reportingMTA] => dsn; e226-55.smtp-out.us-east-2.amazonses.com
        )

    [mail] => Array
        (
            [timestamp] => 2020-11-02T16:37:13.029Z
            [source] => test@emailaddress.com
            [sourceArn] => arn:somethingsomethingdotcom
            [sourceIp] => ip.address.here
            [sendingAccountId] => somethingsomething
            [messageId] => numbersnumbers1234567890
            [destination] => Array
                (
                    [0] => bounce@simulator.amazonses.com
                )

        )

)
  

Теперь все, что вам нужно сделать, это следовать «пути» к элементу, на который вы хотите сослаться. Т.е. для emailAddress давайте возьмем обратный «маршрут»:

emailAddress живет в массиве с ключом [0] (вот он, ключ [0] )
ключ [0] живет в массиве с ключом [bouncedRecipients]
ключ [bouncedRecipients] находится в массиве с ключом [bounce]
ключ [bounce] находится в корне массива $arr .

Итак, у вас есть путь к вашему элементу:
['bounce']['bouncedRecipients'][0]['emailAddress']

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

1. Большое вам спасибо. Я был почти там. Я просто забыл [0] .

2. @berend Было бы слишком сложно объяснить индекс [0], чтобы я полностью понял? Спасибо.

3. @IRGeekSauce добавил небольшое объяснение, надеюсь, это поможет, успокойтесь!

4. Идеальное объяснение. Спасибо!