За последние 24 часа нас посетил 22471 программист и 1593 робота. Сейчас ищет 1721 программист ...

Не могу прочитать JSON через json_decode

Тема в разделе "Прочие вопросы по PHP", создана пользователем MrDio, 14 апр 2018.

  1. MrDio

    MrDio Новичок

    С нами с:
    19 май 2017
    Сообщения:
    21
    Симпатии:
    0
    Товарищи, помогите плиз разобраться.
    Получаю от сервера следующий ответ (это то что я вижу в браузере!):

    Код (Text):
    1. {"value":"Беспроводные ушные мониторы (радионаушники) LD Systems MEI One 3. Прибор абсолютно новый. В коробке и заводской упаковке. Из Европы.\n\nБеспроводная система мониторинга LD Systems MEI ONE 3 - представляемая система от LD Systems расширяет диапазон пользовательских систем с доступными ценами. Теперь, благодаря этой аудио системе, абсолютно каждый может позволить себе комфорт беспроводного мониторинга. MEI ONE 3 доступен в 3 различных вариантах фиксированных частот, которые могут работать одновременно и без помех. Так же можно использовать один передатчик и неограниченное количество приемников, при этом все будут слышать тоже самое, с одинаково качественным звучанием. \n\nОсновные характеристики:\n - Стерео\/моно: Моно или стерео;\n - Управляемые частоты: Да;\n - Конструкция передатчика: 9,5\"\/1 рэковое пространство;\n - Индикатор передатчика: Индикатор из последовательных LED-светодиодов;\n - Соединения передатчика: 2 x комбинированных \"Нейтрик\"; 6,3 мм выход на наушники;\n - Индикатор при+C2ёмника: Нет;\n - Соединения приёмника: Мини-джек, стерео;\n - Вкю лимитер: Да.\n\nВ наличии несколько штук, все абсолютно новое, в коробках и заводской упаковке из Европы.\n----------------------------------------\nРаботаем с 2011 года. Огромное количество отзывов на сайтах DDmart, Digital-Drums, группе вконтакте: \/ddrums и на музыкальных форумах.\nЦены ниже чем в магазинах города. Гарантия 1 год.\nДоставка в любой регион России транспортными компаниями, самовывоз или курьерская доставка по Санкт-Петербургу и области.","error":null,"hasWysiwyg":false,"vasTypeId":26}
    Пытаюсь скормить это json_decode(), но он возвращает NULL
    json_last_error() => 4 (т.е. ошибка в структуре json).

    Делаю сохранение в файл, того что получил с сервера, в файле оказывается следующее (тестовый файл прикрепил к посту).

    mb_detect_encoding() говорит что это ASCII.
    Предпологаю, что проблема с кодировкой пытаюсь всеми известными мне способами сконвертировать это UTF-8: mb_convert_encoding, utf8_encode, iconv - все одно и тоже: json_decode не работает.
    При этом если скопировать содеожимое первого спойлера в какой-нибудь сервис типа: http://freeonlinetools24.com/json-decode - то все прекрасно декодируется.

    Подскажите плиз куда копать!
     

    Вложения:

    • people.txt
      Размер файла:
      10,3 КБ
      Просмотров:
      2
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    У меня запускается. Где в браузере видишь? Исходный код var_dump()?
     
  3. MrDio

    MrDio Новичок

    С нами с:
    19 май 2017
    Сообщения:
    21
    Симпатии:
    0
    Весь код наверное сложно всунуть сюда. Куски:

    1. Логинюсь в свой кабинет на авито и дергаю страницу с редактированием своего объявления через функцию CURL:
    PHP:
    1. $ret = $cm->URIRequest('https://www.avito.ru/items/edit/'.$out['avito_id'], 'GET', FALSE, FALSE, FALSE, 'http://www.avito.ru');
    получаю много HTML в том числе следующий кусок:

    Код (Text):
    1.  <div
    2. class="item-edit-description js-item-edit-description"
    3. data-params='{"value":"Беспроводные ушные мониторы (радионаушники) LD Systems MEI One 3. Прибор абсолютно новый. В коробке и заводской упаковке. Из Европы.\n\nБеспроводная система мониторинга LD Systems MEI ONE 3 - представляемая система от LD Systems расширяет диапазон пользовательских систем с доступными ценами. Теперь, благодаря этой аудио системе, абсолютно каждый может позволить себе комфорт беспроводного мониторинга. MEI ONE 3 доступен в 3 различных вариантах фиксированных частот, которые могут работать одновременно и без помех. Так же можно использовать один передатчик и неограниченное количество приемников, при этом все будут слышать тоже самое, с одинаково качественным звучанием. \n\nОсновные характеристики:\n - Стерео\/моно: Моно или стерео;\n - Управляемые частоты: Да;\n - Конструкция передатчика: 9,5\"\/1 рэковое пространство;\n - Индикатор передатчика: Индикатор из последовательных LED-светодиодов;\n - Соединения передатчика: 2 x комбинированных \"Нейтрик\"; 6,3 мм выход на наушники;\n - Индикатор при+C2ёмника: Нет;\n - Соединения приёмника: Мини-джек, стерео;\n - Вкю лимитер: Да.\n\nВ наличии несколько штук, все абсолютно новое, в коробках и заводской упаковке из Европы.\n----------------------------------------\nРаботаем с 2011 года. Огромное количество отзывов на сайтах DDmart, Digital-Drums, группе вконтакте: \/ddrums и на музыкальных форумах.\nЦены ниже чем в магазинах города. Гарантия 1 год.\nДоставка в любой регион России транспортными компаниями, самовывоз или курьерская доставка по Санкт-Петербургу и области.","error":null,"hasWysiwyg":false,"vasTypeId":26}'></div>
    2. Загружаю это дело в simplehtmldom:
    PHP:
    1. $html_adv = str_get_html($ret, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=false, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT);
    3. Парсим, дабы вытащить текст объявления:
    PHP:
    1. $item_description = $html_adv->find('div[class="item-edit-description js-item-edit-description"]',0);
    2. $out['description_json'] = trim($item_description->{'data-params'});
    4. Пытаемся сконвертить в UTF-8
    PHP:
    1. $out['description_json'] = utf8_encode($out['description_json']);
    5. Получаем вот такой вар_дамп var_dump($out['description_json']):

    Код (Text):
    1. string(10598) "{"value":"Беспроводные ушные мониторы (радионаушники) LD Systems MEI One 3. Прибор абсолютно новый. В коробке и заводской упаковке. Из Европы.\n\nБеспроводная система мониторинга LD Systems MEI ONE 3 - представляемая система от LD Systems расширяет диапазон пользовательских систем с доступными ценами. Теперь, благодаря этой аудио системе, абсолютно каждый может позволить себе комфорт беспроводного мониторинга. MEI ONE 3 доступен в 3 различных вариантах фиксированных частот, которые могут работать одновременно и без помех. Так же можно использовать один передатчик и неограниченное количество приемников, при этом все будут слышать тоже самое, с одинаково качественным звучанием. \n\nОсновные характеристики:\n - Стерео\/моно: Моно или стерео;\n - Управляемые частоты: Да;\n - Конструкция передатчика: 9,5\"\/1 рэковое пространство;\n - Индикатор передатчика: Индикатор из последовательных LED-светодиодов;\n - Соединения передатчика: 2 x комбинированных \"Нейтрик\"; 6,3 мм выход на наушники;\n - Индикатор при+C2ёмника: Нет;\n - Соединения приёмника: Мини-джек, стерео;\n - Вкю лимитер: Да.\n\nВ наличии несколько штук, все абсолютно новое, в коробках и заводской упаковке из Европы.\n----------------------------------------\nРаботаем с 2011 года. Огромное количество отзывов на сайтах DDmart, Digital-Drums, группе вконтакте: \/ddrums и на музыкальных форумах.\nЦены ниже чем в магазинах города. Гарантия 1 год.\nДоставка в любой регион России транспортными компаниями, самовывоз или курьерская доставка по Санкт-Петербургу и области.","error":null,"hasWysiwyg":false,"vasTypeId":26}"
    Вроде с виду все прекрасно, но почему-то json_decode($out['description_json']); - нам ничего не возвращает.. :-(
     
  4. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    var_dump(json_decode(str_replace('\n', "\n", $out['description_json'])));
     
  5. MrDio

    MrDio Новичок

    С нами с:
    19 май 2017
    Сообщения:
    21
    Симпатии:
    0
    Выдает: NULL
     
  6. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    var_dump(json_decode(str_replace(['\n', '\\\', '\"'], ["\n", '', ''], $out['description_json'])));
     
  7. MrDio

    MrDio Новичок

    С нами с:
    19 май 2017
    Сообщения:
    21
    Симпатии:
    0
    Ругается: Parse error: syntax error, unexpected '[', expecting ')' in ...
     
  8. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    var_dump(json_decode(str_replace(['\n', '\/', '\"'], ["\n", '', ''], $out['description_json'])));
     
  9. MrDio

    MrDio Новичок

    С нами с:
    19 май 2017
    Сообщения:
    21
    Симпатии:
    0
    Так всеравно ругается.
    Заменил на:

    PHP:
    1.        
    2. $search = Array('\n', '\/', '\"');
    3. $replace = Array("\n", '', '');
    4. $out['description_json'] = str_replace($search, $replace, $out['description_json']);
    Но всеравно не работает.

    В итоге после замены:
    var_dump($out['description_json']):

    Код (Text):
    1. string(10598) "{"value":"Беспроводные ушные мониторы (радионаушники) LD Systems MEI One 3. Прибор абсолютно новый. В коробке и заводской упаковке. Из Европы.\n\nБеспроводная система мониторинга LD Systems MEI ONE 3 - представляемая система от LD Systems расширяет диапазон пользовательских систем с доступными ценами. Теперь, благодаря этой аудио системе, абсолютно каждый может позволить себе комфорт беспроводного мониторинга. MEI ONE 3 доступен в 3 различных вариантах фиксированных частот, которые могут работать одновременно и без помех. Так же можно использовать один передатчик и неограниченное количество приемников, при этом все будут слышать тоже самое, с одинаково качественным звучанием. \n\nОсновные характеристики:\n - Стерео\/моно: Моно или стерео;\n - Управляемые частоты: Да;\n - Конструкция передатчика: 9,5\"\/1 рэковое пространство;\n - Индикатор передатчика: Индикатор из последовательных LED-светодиодов;\n - Соединения передатчика: 2 x комбинированных \"Нейтрик\"; 6,3 мм выход на наушники;\n - Индикатор при+C2ёмника: Нет;\n - Соединения приёмника: Мини-джек, стерео;\n - Вкю лимитер: Да.\n\nВ наличии несколько штук, все абсолютно новое, в коробках и заводской упаковке из Европы.\n----------------------------------------\nРаботаем с 2011 года. Огромное количество отзывов на сайтах DDmart, Digital-Drums, группе вконтакте: \/ddrums и на музыкальных форумах.\nЦены ниже чем в магазинах города. Гарантия 1 год.\nДоставка в любой регион России транспортными компаниями, самовывоз или курьерская доставка по Санкт-Петербургу и области.","error":null,"hasWysiwyg":false,"vasTypeId":26}"
    var_dump(json_decode($out['description_json'])):

    Код (Text):
    1. NULL
     
  10. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    У меня все еще работает
    PHP:
    1. $a='{"value":"Беспроводные ушные мониторы (радионаушники) LD Systems MEI One 3. Прибор абсолютно новый. В коробке и заводской упаковке. Из Европы.\n\nБеспроводная система мониторинга LD Systems MEI ONE 3 - представляемая система от LD Systems расширяет диапазон пользовательских систем с доступными ценами. Теперь, благодаря этой аудио системе, абсолютно каждый может позволить себе комфорт беспроводного мониторинга. MEI ONE 3 доступен в 3 различных вариантах фиксированных частот, которые могут работать одновременно и без помех. Так же можно использовать один передатчик и неограниченное количество приемников, при этом все будут слышать тоже самое, с одинаково качественным звучанием. \n\nОсновные характеристики:\n - Стерео\/моно: Моно или стерео;\n - Управляемые частоты: Да;\n - Конструкция передатчика: 9,5\"\/1 рэковое пространство;\n - Индикатор передатчика: Индикатор из последовательных LED-светодиодов;\n - Соединения передатчика: 2 x комбинированных \"Нейтрик\"; 6,3 мм выход на наушники;\n - Индикатор при+C2ёмника: Нет;\n - Соединения приёмника: Мини-джек, стерео;\n - Вкю лимитер: Да.\n\nВ наличии несколько штук, все абсолютно новое, в коробках и заводской упаковке из Европы.\n----------------------------------------\nРаботаем с 2011 года. Огромное количество отзывов на сайтах DDmart, Digital-Drums, группе вконтакте: \/ddrums и на музыкальных форумах.\nЦены ниже чем в магазинах города. Гарантия 1 год.\nДоставка в любой регион России транспортными компаниями, самовывоз или курьерская доставка по Санкт-Петербургу и области.","error":null,"hasWysiwyg":false,"vasTypeId":26}';
    http://sandbox.onlinephpfunctions.com/code/521bb749dafe9d5943bd073196abbf6cd497984f
     
  11. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Вероятно, проблема в кодировке получаемого json.
    json_decode работает только со строками в кодировке UTF-8
    --- Добавлено ---
    Текущий Json у меня обрабатывается нормально.
    PHP Version 7.0.15
    --- Добавлено ---
    [​IMG]
    --- Добавлено ---
    Попробуй так. Это первый комментарий к документации по функцие json_decode()
     
  12. MrDio

    MrDio Новичок

    С нами с:
    19 май 2017
    Сообщения:
    21
    Симпатии:
    0
    2mahmuzar, в UTF-8 пытался перевести всеми возможными функциями - mb_convert_encoding, utf8_encode, iconv - все одно и тоже: json_decode не работает.
    2nospiou, у меня так тоже работает, не работает, когда от сервера ответ получаю.
    Я вот что думаю, что от сервера в реальности-то приходит такой контент (это кусочек):

    Код (Text):
    1. &#x7B;&quot;value&quot;&#x3A;&quot;&#x0411;&#x0435;&#x0441;&#x043F;&#x0440;&#x043E;&#x0432;&#x043E;&#x0434;&#x043D;&#x044B;&#x0435;&#x20;&#x0443;&#x0448;&#x043D;&#x044B;&#x0435;&#x20;&#x043C;&#x043E;&#x043D;&#x0438;&#x0442;&#x043E;&#x0440;&#x044B;&#x20;&#x28;&#x0440;&#x0430;&#x0434;&#x0438;&#x043E;&#x043D;&#x0430;&#x0443;&#x0448;&#x043D;&#x0438;&#x043A;&#x0438;&#x29;&#x20;LD&#x20;Systems&#x20;MEI&#x20;One&#x20;3.&#x20;&#x041F;&#x0440;&#x0438;&#x0431;&#x043E;&#x0440;&#x20;&#x0430;&#x0431;&#x0441;&#x043E;&#x043B;&#x044E;&#x0442;&#x043D;&#x043E;&#x20;&#x043D;&#x043E;&#x0432;&#x044B;&#x0439;.&#x20;&#x0412;&#x20;&#x043A;&#x043E;&#x0440;&#x043E;&#x0431;&#x043A;&#x0435;&#x20;&#x0438;&#x20;&#x0437;&#x0430;&#x0432;&#x043E;&#x0434;&#x0441;&#x043A;&#x043E;&#x0439;&#x20;&#x0443;&#x043F;&#x0430;&#x043A;&#x043E;&#x0432;&#x043A;&#x0435;.&#x20;&#x0418;&#x0437;&#x20;&#x0415;&#x0432;
    Может по-этому его и не декодировать?
    Как это безобразие превратить в нормальный читаемый текст?
     
  13. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Если от сервера приходит этот контент, откуда json в первом посте?

    Попробуй этот текст пропустить через html_entity_decode
     
  14. MrDio

    MrDio Новичок

    С нами с:
    19 май 2017
    Сообщения:
    21
    Симпатии:
    0
    2mahmuzar - ура, заработало! :)) Все дело было в этом. А JSON т.к. браузер в var_dump показывал обычный читабильный текст. Очевидно, он конвертирует его на лету. Если бы я не сохранил его в файл, так вообще бы было не понять.
    Спасибо всем кто помогал, проблема решена!
     
  15. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Все верно, браузер обрабатывал HTML-сущности как положено).
     
  16. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510