#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. Идеальное объяснение. Спасибо!