Парсинг JSON на PHP

Тема в разделе "Как сделать...", создана пользователем mras..ad, 9 фев 2015.

  1. mras..ad

    mras..ad Создатель

    Регистр.:
    8 фев 2013
    Сообщения:
    41
    Симпатии:
    12
    Есть код:

    Код:
    $url = file_get_contents("http://test.site/api/json.php");
    $content = json_decode($url, true);
    print_r($content);
    Array ( [status] => ok [source] => cache [data] => Array ( [events] => Array ( [0] => Array ( [id] => 927396 [operationDateTime] => 05.02.2015 15:11:00 [operationAttribute] => Единичный
    {"status":"ok","source":"cache","data":{"events":[{"id":"927396","operationDateTime":"05.02.2015 15:11:00","operationAttribute":"\u0415\u0434\u0438\u043d\u0438\u0447\u043d\u044b

    это кусочек из JSON

    мне нужно чтобы выводимые дынные не искажались после декодирования, съедаются кавычки и выводятся название переменных.
    мне нужно просто получить второй вариант только декодированный.

    что делаю не так? подскажите пожалуйста
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.523
    Симпатии:
    1.376
    Вполне валидный декод, в чём вы усматриваете искажение?
    Попробуйте var_export вместо print_r
     
  3. mras..ad

    mras..ad Создатель

    Регистр.:
    8 фев 2013
    Сообщения:
    41
    Симпатии:
    12
    При использовании var_export пустота, но не в нем суть, скорее всего код валидный, просто посмотрите на пример ниже в валидаторе, там выводит код как есть, скорее всего формат вывода чистый потому что он декодирует его на java script'e в ajax json.


    что скажете? на php можно вывести такой же "чистый" код? или по сути нет никакой разницы? просто смущает дополнительный "мусор" вокруг переменных.
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.523
    Симпатии:
    1.376
    json_decode принимает валидный json код и преобразует его в массив на PHP, с которым в дальнейшем можно работать в циклах или через переменные, типа такого:
    PHP:
    echo $content['events'][0]['operationAttribute'];
    То что отдаёт Перейти по ссылке это тот же самый json, но только отформатированный отступами и с преобразованными национальными utf8 символами из заэскейпленных \u.

    А как говорят в Одессе, - это две большие разницы ;)

    И такая \u кодировка это, пусть и не обязательная, но рекомендация стандарта:
    Перейти по ссылке

    Ну в общем одной стандартной функцией такого преобразования не сделаешь надо конвертер писать с рекурсивным обходом массива, ну и вид от Перейти по ссылке это чисто для людей, браузеры могут такого кода не понять...
     
    mras..ad нравится это.
  5. mras..ad

    mras..ad Создатель

    Регистр.:
    8 фев 2013
    Сообщения:
    41
    Симпатии:
    12
    Спасибо большое что разъяснили, где то уже встречал в сети на форумах там приводили куски кода и разкодировку \u.. для каждого символа алфавита и каких то особенных знаков, но это уже отдельная тема.

    Задам еще пару вопросов по теме и хорошего понемножку.

    В примере был виден какой приходит результат кода, как более правильно его стилизировать, чтобы в итоге сделать свою формочку в которю можно вбить трек нажать кнопку и выползет <table ...> с дивами.

    Главное направить, пока что понял что нужно делать так:
    $attribute = $content[data][events][0][operationAttribute];

    потом вставлять "$attribute" в нужное место и окружить его дивами, табличкой и присвоить всему этому стили.

    то есть нужно каждому значению присвоить данные из json и потом вызывать в нужных местах?

    это правильно или есть что то проще, "правильней"?

    еще если нужно больше углубиться в дерево, то:
    echo $content['events'][0]['operationAttribute'][0]['test'][0]['test'][0]['test'][0]['test'][0];?

    [0] - это без ограничений?

    в php начинающий совсем))) :):dk:
     
  6. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    991
    Симпатии:
    267
    0 - это первый элемент массива.
     
  7. mras..ad

    mras..ad Создатель

    Регистр.:
    8 фев 2013
    Сообщения:
    41
    Симпатии:
    12
    еще если нужно больше углубиться в дерево, то:
    echo $content['events'][0]['operationAttribute'][0]['test'][0]['test'][0]['test'][0]['test'][0];?
     
  8. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    991
    Симпатии:
    267
    Если есть вот такой массив $content, например
    [​IMG]

    обратиться можно так
    $content['0']['extension_id'] - выведет 23
    $content['0']['type'] - выведет payment
    $content['0']['code'] - выведет cod

    $content['1']['extension'] - выведет 461
    $content['1']['type'] - выведет payment
    $content['1']['code'] - выведет robokassa

    Если вложенность элементов глубже, то добавляются еще элементы $content['events'][0]['operationAttribute'][0]['test'][0]['test'][0]['test'][0]['test'][0] напрмер так.

    Скорее всего вам нужно обходить все элементы массива. Для этого используется функция Перейти по ссылке
     
    mras..ad нравится это.
  9. mras..ad

    mras..ad Создатель

    Регистр.:
    8 фев 2013
    Сообщения:
    41
    Симпатии:
    12
    Как разжевать и в рот положить, спасибо большое, буду познавать дальше)