Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: json массив
Форумы портала PHP.SU » » Вопросы новичков » json массив

Страниц (1): [1]
 

1. Frozel - 31 Марта, 2017 - 19:34:17 - перейти к сообщению
Привет всем, второй день мучаюсь с json строкой
Спойлер (Отобразить)


Задача: вытащить url фотографии

Этот json из callback api vk:
case 'message_new':
$atch = $data->object->attachments;
$urlphoto = json_decode($atch,true);
//начиная с этого момента я не понимаю как добраться до типа "photo_1280"
$urlphoto->attachments;

Любой другой тип до массива атачмента парсится легко, но с атачментом попытки возвращают либо пустые массивы array либо null либо вовсе ничего.
2. Мелкий - 31 Марта, 2017 - 19:42:30 - перейти к сообщению
А зачем вы аттач пытаетесь ещё раз раскодировать? Это один json, а не дважды закодированный.
PHP:
скопировать код в буфер обмена
  1. $json = '{"type":"message_new","object":{"id":123,"date":1234,"out":0,"user_id":12345,"read_state":0,"title":" ... ","body":"","attachments":[{"type":"photo","photo":{"id":123456,"album_id":1,"owner_id":1234567,"photo_1280":"https:\/\/pp.userapi.com\/XXX\/XXX\/XXX\/XXX.jpg"}}]},"group_id":12345678}';
  2. var_dump(json_decode($json, true)['object']['attachments'][0]['photo']['photo_1280']);
3. Frozel - 31 Марта, 2017 - 19:49:37 - перейти к сообщению
Мелкий пишет:
А зачем вы аттач пытаетесь ещё раз раскодировать? Это один json, а не дважды закодированный.
PHP:
скопировать код в буфер обмена
  1. $json = '{"type":"message_new","object":{"id":123,"date":1234,"out":0,"user_id":12345,"read_state":0,"title":" ... ","body":"","attachments":[{"type":"photo","photo":{"id":123456,"album_id":1,"owner_id":1234567,"photo_1280":"https:\/\/pp.userapi.com\/XXX\/XXX\/XXX\/XXX.jpg"}}]},"group_id":12345678}';
  2. var_dump(json_decode($json, true)['object']['attachments'][0]['photo']['photo_1280']);


Спасибо, но я не понимаю как обратиться к json строке, что передается в callback, поэтому делаю это таким образом:
PHP:
скопировать код в буфер обмена
  1. case 'message_new':
  2. $atch = $data->object->attachments;
  3. $urlphoto = json_decode($atch,true);


дальше на сколько я понимаю, возвращается json строка:
PHP:
скопировать код в буфер обмена
  1. [{"type":"photo","photo":{"id":123456,"album_id":1,"owner_id":1234567,"photo_1280":"https:\/\/pp.userapi.com\/XXX\/XXX\/XXX\/XXX.jpg"}}]


И тут уже встает вопрос: как вытащить url из photo_1280
4. Мелкий - 31 Марта, 2017 - 20:00:03 - перейти к сообщению
Мелкий пишет:
А зачем вы аттач пытаетесь ещё раз раскодировать? Это один json, а не дважды закодированный.
5. Frozel - 31 Марта, 2017 - 20:02:17 - перейти к сообщению
Мелкий пишет:
Мелкий пишет:
А зачем вы аттач пытаетесь ещё раз раскодировать? Это один json, а не дважды закодированный.


Не понимаю вопроса, где я второй раз его раскодирую? Имеете ввиду, что в
PHP:
скопировать код в буфер обмена
  1. $atch = $data->object->attachments;

приходит раскодированная строка?

Json строка, которую я указал, я ее вытащил из запроса callback чтобы показать наглядно, что она из себя представляет, а в коде я могу получить ее только через:
PHP:
скопировать код в буфер обмена
  1. $atch = $data->object->attachments;
6. Мелкий - 31 Марта, 2017 - 20:08:29 - перейти к сообщению
Frozel пишет:
приходит раскодированная строка?

Да, json_decode умеет распаковывать массивы в том числе.
Документ под спойлером в начале темы - это один-единственный json и разбирается он полностью одним вызовом json_decode.
В object->attachments расположен массив. Массив асоциативных массивов или массив stdobject, в зависимости от второго параметра json_decode.
7. Frozel - 31 Марта, 2017 - 20:17:18 - перейти к сообщению
Мелкий пишет:
Frozel пишет:
приходит раскодированная строка?

Да, json_decode умеет распаковывать массивы в том числе.
Документ под спойлером в начале темы - это один-единственный json и разбирается он полностью одним вызовом json_decode.
В object->attachments расположен массив. Массив асоциативных массивов или массив stdobject, в зависимости от второго параметра json_decode.


Это конечно всё замечательно и понятноУлыбка Но я не знаю как вызвать эту json строку иными способами, кроме как обращаться непосредственно к объекту в кейсе. После обращения к объекту, в данном случае аттачмент, возвращается его массив, и как парсить из него какой-либо тип - я не понимаю Не понял
8. ytrewq123 - 31 Марта, 2017 - 20:56:08 - перейти к сообщению
Так в чём проблема???
Какую строку ЁСОНа вы имеете?
Если эту, то так.
PHP:
скопировать код в буфер обмена
  1. [/PHP]
  2. $json = json_decode('[{"type":"photo","photo":{"id":123456,"album_id":1,"owner_id":1234567,"photo_1280":"https:\/\/pp.userapi.com\/XXX\/XXX\/XXX\/XXX.jpg"}}]');
  3. var_dump( $json[0]->photo->photo_1280);
  4. [PHP]
9. Frozel - 31 Марта, 2017 - 21:02:29 - перейти к сообщению
Решил проблемуУлыбка До меня всё-таки дошел смысл слов про "дважды раскодировать" Радость

 

Powered by ExBB FM 1.0 RC1