PHP и формат передачи данных JSON. Возврат JSON не работает должным образом

Детские товары 31.03.2019

JSON (JavaScript Object Notation) – формат для обмена данными в текстовом виде. Позволяющий передавать сложные структуры данных в сериализованном виде. Этот формат передачи данных стал настолько популярен, что уже в ядро PHP начиная с версии 5.2.0, были добавлены функции по обработке данных в этом формате. А это значит, что нет необходимости в подключении дополнительных расширений. Формат данных JSON хорошо понятен человеку. Кроме того данный тип обмена данными широко используется между различными API сервисами. А при корректной разработке алгоритмов для обмена информацией, можно получить очень высокий прирост скорости чем, к примеру, при работе с данными в формате XML .

Отправка данных

Отправить данные в формате JSON можно двумя способами: сформировать GET или POST запрос с закодированными данными расположенными в GET или POST переменной или же поместить данные в тело документа. На практике обычно используется второй вариант.

Для произведения отправки данных необходимы нижеперечисленные функции:

  • string json_encode (mixed value [, int options = 0 ])

    В качестве параметра value указываются данные которые требуется закодировать. Поддерживается любой тип кроме типа resource . Параметр options содержит битовую маску из возможных предоставленных значений (см. таблицу с предоставленными JSON константами).

  • resource stream_context_create (])

    Данная функция предназначена для создания и возврата контекста потока с опциями указанными в параметре options . Необязательный параметр options должен иметь тип ассоциативного массива. Изначально, он пуст. Второй необязательный параметр params также должен являться ассоциативным массивом в формате $data[‘имя’] = значение.

  • string file_get_contents (string filename [, bool use_include_path [, resource context [, int offset [, int maxlen ]]]])

    Использование этой функции позволяет получить содержимое файла в виде строки. Параметр filename это имя считываемого файла. В параметре use_include_path начиная с версии PHP 5 можно использовать константу FILE_USE_INCLUDE_PATH для поиска файла в include path. Параметр context представляет ресурс контекста, созданный с помощью функции stream_context_create(). В случае неудавшейся попытки открытия файла, будет возвращено значение false . Параметр offset содержит смещение с которого начнется чтение данных. В параметре maxlen указывается размер получаемых данных.

    Примечание : смещение не указывается при работе, с удаленными потоками.

Ниже приведен пример отправки данных в формате JSON:

// Данные для отправки $request = array("StartDate" => "2013-10-10", "EndDate" => "2013-10-10", "IDS" => array(1,2,3,4,5,6,7)); // Указание опций для контекста потока $options = array ("http" => array ("method" => "POST", "header" => "Content-Type: application/json; charset=utf-8\r\n", "content" => json_encode($request))); // Создание контекста потока $context = stream_context_create($options); // Отправка данных и получение результата echo file_get_contents("http://test.ru/json.php", 0, $context);

Здесь используется импровизированная структура данных, состоящая из начальной и конечной даты, а также массива номеров некоторых условных записей. Обратите внимание на то, что в заголовке запроса Content-Type указывается тип “application/json”.

Получение данных

Для того чтобы получить переданные данные вышеописанным способом требуется произвести чтение данных из потока ввода “php://input ”.

Используемые функции для принятия данных:

  • mixed json_decode (string json [, bool assoc = false [, int depth = 512 [, int options = 0 ]]])

    Данная функция декодирует строку в формате JSON . В параметре json указывается строка для декодирования. Параметр assoc отвечает за то, будут ли возвращаемые данные преобразованы в ассоциативный массив. Если таковая необходимость имеется, то необходимо указать в качестве значения этого параметра true . Параметр depth указывает на глубину рекурсии. И последний четвертый параметр options содержит битовую маску опций для декодирования. На сегодняшний день поддерживается только JSON_BIGINT_AS_STRING (по умолчанию большие целые числа приводятся к числам с плавающей запятой (float))

  • resource fopen (string filename , string mode [, bool use_include_path [, resource context ]])

    Открывает файл и возвращает его дескриптор. Параметр filename это именованный ресурс, указывающий на файл. В параметре mode указывается тип доступа к файлу (см. таблицу со списком возможных режимов для fopen()). Далее идут два необязательных параметра это: use_include_path и context . При установке параметра use_include_path в значение true или 1 и при условии, что в качестве именованного ресурса задан относительный путь, будет осуществлен поиск открываемого файла в списке директорий используемом функциями include и require . На практике этот параметр практически не используется. Параметр context используется для указания контекста ресурса.

  • string stream_get_contents (resource handle [, int maxlen = -1 [, int offset = -1 ]])

    Эта функция позволяет получить содержимое потока в виде строки. Параметр handle является ресурсом потока. Параметр maxlen содержит максимальное количество байт для чтения. По умолчанию он установлен в -1, что указывает на получение всех данных. Параметр offset содержит смещение, с которого начнется чтение данных. По умолчанию он также установлен в -1, что означает, что чтение будет произведено с начальной позиции.

Ниже приведен пример получения данных в формате JSON на стороне сервера:

// Открываем на чтение поток ввода $f = fopen("php://input", "r"); // Получаем содержимое потока $data = stream_get_contents($f); if ($data) { // Код обработки print_r(json_decode($data)); }

Полученная структура данных:

StdClass Object ( => 2013-10-10 => 2013-10-10 => Array ( => 1 => 2 => 3 => 4 => 5 => 6 => 7))

Примечание : необходимо учитывать тот момент, что для работы с форматом JSON, данные должны быть в кодировке utf-8.

Предоставленные JSON константы для функции json_encode()

JSON_HEX_TAG (integer) Все кодируются в \u003C и \u003E. Доступна начиная с PHP 5.3.0.
JSON_HEX_AMP (integer) Все & кодируются в \u0026. Доступна начиная с PHP 5.3.0.
JSON_HEX_APOS (integer) Все символы ‘ кодируются в \u0027. Доступна начиная с PHP 5.3.0.
JSON_HEX_QUOT (integer) Все символы " кодируются в \u0022. Доступна начиная с PHP 5.3.0.
JSON_FORCE_OBJECT (integer) Выдавать объект вместо массива при использовании неассоциативного массива. Это полезно, когда принимающая программа или код ожидают объект или же массив пуст. Доступна начиная с PHP 5.3.0.
JSON_NUMERIC_CHECK (integer) Кодирование строк, содержащих числа, как числа. Доступна начиная с PHP 5.3.3.
JSON_BIGINT_AS_STRING (integer) Кодирует большие целые числа в виде их строковых эквивалентов. Доступна начиная с PHP 5.4.0.
JSON_PRETTY_PRINT (integer) Использовать пробельные символы в возвращаемых данных для их форматирования. Доступна начиная с PHP 5.4.0.
JSON_UNESCAPED_SLASHES (integer) Не экранировать /. Доступна начиная с PHP 5.4.0.
JSON_UNESCAPED_UNICODE (integer) Не кодировать многобайтные символы Unicode (по умолчанию они кодируются как \uXXXX). Доступна начиная с PHP 5.4.0.

Список возможных режимов для fopen() используя mode

‘r’ Открывает файл только для чтения; помещает указатель в начало файла.
‘r+’ Открывает файл для чтения и записи; помещает указатель в начало файла.
‘w’ Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пробует его создать.
‘w+’ Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пытается его создать.
‘a’ Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует — пытается его создать.
‘a+’ Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует — пытается его создать.
‘x’ Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст ошибку уровня E_WARNING. Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2).
‘x+’ Создаёт и открывает для чтения и записи; иначе имеет то же поведение что и’x’.
‘c’ Открывает файл только для записи. Если файл не существует, то он создается. Если же файл существует, то он не обрезается (в отличии от ‘w’), и вызов к этой функции не вызывает ошибку (также как и в случае с ‘x’). Указатель на файл будет установлен на начало файла. Это может быть полезно при желании заблокировать файл (смотри flock()) перед изменением, так как использование ‘w’ может обрезать файл еще до того как была получена блокировка (если вы желаете обрезать файл, можно использовать функцию ftruncate() после запроса на блокировку).
‘c+’ Открывает файл для чтения и записи; иначе имеет то же поведение, что и ‘c’.

В этой статье я хочу рассказать о текстовом формате обмена данными — JSON, а именно — про работу с этим форматом в PHP.

JSON — компактный текстовый формат данных. Может применяться как в интернет-службах передачи данных, так и для хранения информации в структурированном виде.

JSON (англ. JavaScript Object Notation ) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми.

Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается языконезависимым и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON.

Практическая польза использования JSON открывается при использовании технологии AJAX . Формат JSON является более кратким и удобочитаемым по сравнению с XML , является «родным» для Javascript. Кроме того, в JSON-код возможна вставка вполне работоспособных функций.

Да, именно в технологии AJAX , на мой взгляд, его основное применение. Так как технология AJAX подразумевает отправку запроса клиентов на сервер. Далее на сервере запрос обрабатывается, и результат отправляется в ответ клиенту.

Вид данных в формате JSON

JSON поддерживает все основные форматы данных: строки, числа, булевые значения, а так же массивы и объекты (комбинации ключ: значение, разделенные запятыми и заключающимися в фигурные скобки).

Приведем пример представления данных в формате JSON:

{"id":"1","name":"ivan","country":"Russia","office":["yandex","management"]}

Давайте разберем, что этой строкой можно передать: человек с именем «ivan», под идентификатором «1», проживающий в стране «Russia» работает в компании «yandex» в отделе «management».

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

Пример ответа об ошибке в формате JSON:

{"error":"1","errorcode":["empty_pers","empty_mail","empty_phone","empty_letter","empty_scode"]}

Что, к примеру, означает:

  • Необходимо заполнить поле «Контактное лицо»
  • Необходимо заполнить поле «E-mail»
  • Необходимо заполнить поле «Телефон»
  • Введите текст сообщения
  • Необходимо заполнить поле «Число на картинке»

В случае, если ошибок нет, то возвращается ответ:

{"error":"0"}

Что говорит об успешной отправке данных.

В PHP, для представления данных в формате JSON служит расширение JSON extension . В версиях PHP старше 5.2.0 поддержка JSON встроена в ядро, в более ранних версиях необходимо подключать к вашему скрипту дополнительный файл с функциями.

Итак в PHP, за работу с данными в формате JSON отвечают две функции: json_encode() и json_decode() .

Конвертация данных в формат JSON

$json_data = array ("id"=>1,"name"=>"ivan","country"=>"Russia","office"=>array("yandex"," management")); echo json_encode($json_data);

Обратное преобразование данных из формата JSON

$json_string="{"id":1,"name":"ivan","country":"Russia","office":["yandex"," management"]} "; $obj=json_decode($json_string);

Теперь в $obj будут содержаться JSON данные переведенные в PHP-объект, доступ к которым вы сможете получить следующим образом:

Echo $obj->name; //Отобразит имя ivan echo $obj->office; //Отобразит компанию yandex

Как видите, $obj->office является массивом.

Foreach($obj->office as $val) echo $val;

Работа с JSON позволяет обмениваться с сервером данными в «чистом виде» . Полностью отпадает необходимость пересылать громоздкие куски HTML кода.

function getData(id) { $.ajax({ url: "some url", crossDomain: true, type: "post", data: { id: id }, success: function (data) { var json = jQuery.parseJSON(data); alert(data); }, }); };

$name, "clubID" => $clubID, "lID" => $lID, "sName" => $sName, "description" => $desc)); echo $json; ?>

Предупреждения javascript в виде , … Что не должно быть так …

Не повторяйте $ ID в своем PHP. Используйте свойство ajax dataType jQuery и установите его в json. Использовать json-парсер javascript по умолчанию.

попробуйте оповестить json а не data ?

Javascript возвращает объект, потому что вы фактически предупреждаете объект. Попробуйте alert(data.name);

или alert(data.clubID); , это будет работать.

Вы должны указать тип данных, который запрашивает запрос ajax, иначе jQuery будет «интеллектуально» обнаруживать на основе типа MIME. Если вызов ajax получает данные json, он будет использовать его как объект JavaScript, поэтому вы получаете это предупреждение.

Это верно.

JSON – это объект. aka Javascript Object Notation . Это должно быть на случай. Он должен содержать ваши данные. Попробуйте data.* .

Кстати, если вы не очистите данные, поступающие от ваших пользователей, прежде чем использовать их с любым SQL-запросом, это вызовет проблемы.

См. Его в действии с базовым примером:

// $_POST["id"] = "" OR 1"" $result = mysql_query("SELECT * FROM clubmember WHERE clubID = "".$ID.""");

Ваш запрос сейчас

SELECT * FROM clubmember WHERE clubID ="" OR 1 ""

Потому что 1 всегда верно, теперь я могу взять весь ваш клубный стол. Приветствия.

Даже если parseJSON возвращает объект, выполнение console.log должно показывать который является массивом объекта

Вызов.ajax () будет, если параметр dataType не указан, «разумно угадать», что возвращает запрошенная страница.
В случае JSON он передаст объект JavaScript в функцию успеха.

Рассмотрев ваш вопрос (ы), я считаю, что понимаю, что вы имеете в виду. То, что вы ожидаете, – это один объект (поиск с использованием SQL, как это было сказано очень небезопасно) с 5 свойствами, именем, clubID, lID, sName и описанием. Однако, похоже, что вы возвращаетесь, это несколько строк с двумя свойствами?
Вы говорите, что в то время как эхо php-скрипта имеет правильные значения (одна строка), но JSON получает несколько значений (/ rows).
Вы уверены, что PHP получает правильный ID от вызова AJAX?



Рекомендуем почитать

Наверх