Как получить json в php
Перейти к содержимому

Как получить json в php

  • автор:

json_decode

Принимает закодированную в JSON строку и преобразовывает её в PHP-значение.

Список параметров

Строка ( string ) json для декодирования.

Функция работает только со строками в кодировке UTF-8.

Замечание:

PHP реализует надмножество JSON, который описан в первоначальном » RFC 7159.

associative

Если true , объекты JSON будут возвращены как ассоциативные массивы ( array ); если false , объекты JSON будут возвращены как объекты ( object ). Если null , объекты JSON будут возвращены как ассоциативные массивы ( array ) или объекты ( object ) в зависимости от того, установлена ли JSON_OBJECT_AS_ARRAY в flags .

Максимальная глубина вложенности структуры, для которой будет производиться декодирование. Значение должно быть больше 0 и меньше или равно 2147483647 .

Битовая маска из констант JSON_BIGINT_AS_STRING , JSON_INVALID_UTF8_IGNORE , JSON_INVALID_UTF8_SUBSTITUTE , JSON_OBJECT_AS_ARRAY , JSON_THROW_ON_ERROR . Поведение этих констант описаны на странице JSON-констант.

Возвращаемые значения

Возвращает данные json , преобразованные в типы PHP. Не заключённые в кавычки значения true , false и null возвращаются как типизированные значения true , false и null . Значение с типом null также возвращается в случаях, когда параметр json не может быть преобразован или глубина вложенности структуры превышет установленный предел.

Ошибки

Начиная с PHP 8.0.0, если значение параметра depth выходит за пределы допустимого диапазона, функция выбрасывает исключение ValueError ; ранее выдавалась ошибка уровня E_WARNING .

Список изменений

Версия Описание
7.3.0 Добавлена константа JSON_THROW_ON_ERROR для параметра flags .
7.2.0 associative теперь nullable.
7.2.0 Добавлены константы JSON_INVALID_UTF8_IGNORE и JSON_INVALID_UTF8_SUBSTITUTE для параметра flags .
7.1.0 Пустой ключ JSON («») будет преобразован в пустое свойство объекта, а не в свойство со значением _empty_ .

Примеры

Пример #1 Примеры использования json_decode()

var_dump ( json_decode ( $json ));
var_dump ( json_decode ( $json , true ));

Результат выполнения приведённого примера:

object(stdClass)#1 (5) < ["a"] =>int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) > array(5) < ["a"] =>int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) >

Пример #2 Доступ к свойствам объектов с неправильными именами

Доступ к элементам объекта, которые содержат символы, недопустимые в соответствии с соглашением об именах PHP (то есть дефис), может быть выполнен путём обрамления имени элемента фигурными скобками и апострофами.

$obj = json_decode ( $json );
print $obj ->< 'foo-bar' >; // 12345

Пример #3 Распространённая ошибка при использовании json_decode()

// Следующие строки являются валидным кодом JavaScript, но не валидными JSON-данными

// Имя и значение должны помещаться в двойные кавычки
// Одинарные кавычки использовать нельзя
$bad_json = «< 'bar': 'baz' >» ;
json_decode ( $bad_json ); // null

// Имя должно обрамляться в двойные кавычки
$bad_json = ‘< bar: "baz" >‘ ;
json_decode ( $bad_json ); // null

// Не должно быть завершающей запятой (без последующего элемента)
$bad_json = ‘< bar: "baz", >‘ ;
json_decode ( $bad_json ); // null

Пример #4 Ошибки с глубиной вложенных объектов ( depth )

// Закодируем данные с глубиной вложенности 4 (array -> array -> array -> string).
$json = json_encode (
array(
1 => array(
‘English’ => array(
‘One’ ,
‘January’
),
‘French’ => array(
‘Une’ ,
‘Janvier’
)
)
)
);

// Напечатаем ошибки для разных глубин.
var_dump ( json_decode ( $json , true , 4 ));
echo ‘Последняя ошибка: ‘ , json_last_error_msg (), PHP_EOL , PHP_EOL ;

var_dump ( json_decode ( $json , true , 3 ));
echo ‘Последняя ошибка: ‘ , json_last_error_msg (), PHP_EOL , PHP_EOL ;
?>

Результат выполнения приведённого примера:

array(1) < [1]=>array(2) < ["English"]=>array(2) < [0]=>string(3) "One" [1]=> string(7) "January" > ["French"]=> array(2) < [0]=>string(3) "Une" [1]=> string(7) "Janvier" > > > Последняя ошибка: No error NULL Последняя ошибка: Maximum stack depth exceeded

Пример #5 json_decode() с большими целыми числами

var_dump ( json_decode ( $json ));
var_dump ( json_decode ( $json , false , 512 , JSON_BIGINT_AS_STRING ));

Результат выполнения приведённого примера:

object(stdClass)#1 (1) < ["number"]=>float(1.2345678901235E+19) > object(stdClass)#1 (1) < ["number"]=>string(20) "12345678901234567890" >

Примечания

Замечание:

Спецификация JSON — это не JavaScript, а его подмножество.

Замечание:

В случае возникновения ошибки декодирования можно использовать json_last_error() для определения её причины.

Смотрите также

  • json_encode() — Возвращает JSON-представление данных
  • json_last_error() — Возвращает последнюю ошибку

User Contributed Notes 8 notes

2 years ago

JSON can be decoded to PHP arrays by using the $associative = true option. Be wary that associative arrays in PHP can be a «list» or «object» when converted to/from JSON, depending on the keys (of absence of them).

You would expect that recoding and re-encoding will always yield the same JSON string, but take this example:

$json = »;
$array = json_decode($json, true); // decode as associative hash
print json_encode($array) . PHP_EOL;

This will output a different JSON string than the original:

The object has turned into an array!

Similarly, a array that doesn’t have consecutive zero based numerical indexes, will be encoded to a JSON object instead of a list.

$array = [
‘first’,
‘second’,
‘third’,
];
print json_encode($array) . PHP_EOL;
// remove the second element
unset($array[1]);
print json_encode($array) . PHP_EOL;

The output will be:

The array has turned into an object!

In other words, decoding/encoding to/from PHP arrays is not always symmetrical, or might not always return what you expect!

On the other hand, decoding/encoding from/to stdClass objects (the default) is always symmetrical.

Arrays may be somewhat easier to work with/transform than objects. But especially if you need to decode, and re-encode json, it might be prudent to decode to objects and not arrays.

If you want to enforce an array to encode to a JSON list (all array keys will be discarded), use:

If you want to enforce an array to encode to a JSON object, use:

Как прочитать JSON средствами PHP?

Возможно вы знаете что данные в формате JSON (JavaScript Object Notation) могут храниться в виде файлов. Обычно они выглядят как — data.json . Фактически это текстовый файл содержащий данные и отформатированный в соответствии с правилами стандарта JSON в виде пары ключ-значение.

Пример JSON

Чтение файла средствами PHP

Для того чтобы прочитать данные в файле JSON существует функция file_get_content . В самом простом варианте достаточно передать в нее расположение файла JSON и сохранить данные в нужную нам переменную.
Давайте сделаем это и посмотрим что у нас получилось через var_dump :

$ourData = file_get_content("data.json"); var_dump($ourData);

В результате работы вышеописанного кода PHP прочитает данные из файла в переменную $ourData и затем выведет ее содержание:

// Код отформатирован для удобства отображения string(99) "< "name": "Super hero", "town": "Metro City", "formed": "2016", "location": "Super tower" >"

Как видим, данные из файла JSON сохранились в переменную и по сути представляют из себя строку — string

Работать с чистой строкой не особо удобно, поэтому к нам на помощь приходит функция json_decode применить которую можно в нескольких вариантах.

Преобразуем JSON в объект PHP

Вызов функции json_decode в простейшем варианте преобразит строку из файла JSON в PHP объект (Object)

// получаем данные из JSON файла $ourData = file_get_contents("data.json"); // Преобразуем в объект $object = json_decode($ourData); var_dump($object); // выводим объект 

В результате мы получим объект PHP:

object(stdClass)#1 (4) < ["name"]=>string(10) "Super hero" ["town"]=> string(10) "Metro City" ["formed"]=> string(4) "2016" ["location"]=> string(11) "Super tower" >

И теперь мы можем обратиться к отдельным элементам объекта:

echo $object->name; // Выведет Super hero echo $object->location; // Выведет Super tower 

Преобразуем JSON в массив PHP

Для преобразования в ассоциативный массив воспользуемся функцией json_decode с булевым параметром:

// получаем данные из JSON файла $ourData = file_get_contents("data.json"); // Преобразуем в массив $array = json_decode($ourData, true); var_dump($array); // выводим массив 

PHP выведет на странице ассоциативный массив:

array(4) < ["name"]=>string(10) "Super hero" ["town"]=> string(10) "Metro City" ["formed"]=> string(4) "2016" ["location"]=> string(11) "Super tower" >

Это позволяет нам теперь обращаться к отдельным данным массива:

echo $array["town"]; // выведет Metro City

Дополнительные материалы:

В этом уроке мы использовали некоторые базовые функции PHP. Ниже ссылки на их документацию на официальном сайте PHP:

Хочешь стать по-настоящему крутым разработчиком — обучайся в Hexlet.

JSON PHP

Обычно JSON используется для получения данных с сервера и вывода их на веб-странице.

В этой главе мы рассмотрим как обмениваться данными JSON между клиентом и сервером на PHP.

PHP файл

В PHP есть несколько встроенных функций для работы с данными JSON.

Объекты в PHP могут конвертироваться в JSON при помощи PHP функции json_encode():

 name = "John"; $myObj->age = 30; $myObj->city = "New York"; $myJSON = json_encode($myObj); echo $myJSON; ?> 

Клиентский JavaScript

К PHP файлу из предыдущего примера можно обратиться по AJAX запросу, используя на стороне клиента следующий JavaScript код. Функция JSON.parse() конвертирует полученные данные в JavaScript объект:

 var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() < if (this.readyState == 4 && this.status == 200) < var myObj = JSON.parse(this.responseText); document.getElementById("demo").innerHTML = myObj.name; >>; xmlhttp.open("GET", "demo_file.php", true); xmlhttp.send(); 

PHP массив

Массивы в PHP также конвертируются в JSON при помощи PHP функции json_encode():

Клиентский JavaScript

К PHP массиву из предыдущего примера также можно обратиться по AJAX запросу, используя на стороне клиента следующий JavaScript код. Функция JSON.parse() конвертирует полученные данные в JavaScript массив:

 var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() < if (this.readyState == 4 && this.status == 200) < var myObj = JSON.parse(this.responseText); document.getElementById("demo").innerHTML = myObj[2]; >>; xmlhttp.open("GET", "demo_file_array.php", true); xmlhttp.send(); 

PHP база данных

PHP — это серверный язык программирования и используется для операций, выполняемых только на стороне сервера, например, для доступа к базе данных.

Представьте, что у вас на сервере есть база данных, в которой содержится информация о товарах, покупателях и поставщиках. И вы хотите получить 10 первых записей в таблице покупателей («customers»).

Используем функцию JSON.stringify(), чтобы конвертировать JavaScript объект в JSON:

 obj = < "table":"customers", "limit":10 >; dbParam = JSON.stringify(obj); xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() < if (this.readyState == 4 && this.status == 200) < document.getElementById("demo").innerHTML = this.responseText; >>; xmlhttp.open("GET", "json_demo_db.php?x language-php"> query("SELECT name FROM ".$obj->table." LIMIT ".$obj->limit); $outp = array(); $outp = $result->fetch_all(MYSQLI_ASSOC); echo json_encode($outp); ?> 

Объяснение PHP файла:

  • Конвертируем данные запроса в объект при помощи PHP функции json_decode().
  • Обращаемся к базе данных и заполняем массив запрошенными данными.
  • Добавляем массив к объекту и возвращаем объект в виде строки JSON, используя функцию json_encode().

Обход полученных данных

Теперь конвертируем данные, полученные от PHP файла, в JavaScript объект или в данном случае в JavaScript массив. Для этого используем функцию JSON.parse():

 . xmlhttp.onreadystatechange = function() < if (this.readyState == 4 && this.status == 200) < myObj = JSON.parse(this.responseText); for (x in myObj) < txt += myObj[x].name + "
"; > document.getElementById("demo").innerHTML = txt; > >; .

PHP метод POST

При отправке данных на сервер лучше всего использовать метод POST.

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

Данные, отправляемые на сервер, теперь должны быть аргументом в методе send():

 obj = < "table":"customers", "limit":10 >; dbParam = JSON.stringify(obj); xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() < if (this.readyState == 4 && this.status == 200) < myObj = JSON.parse(this.responseText); for (x in myObj) < txt += myObj[x].name + "
"; > document.getElementById("demo").innerHTML = txt; > >; xmlhttp.open("POST", "json_demo_db_post.php", true); xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlhttp.send("x language-php"> query("SELECT name FROM ".$obj->table." LIMIT ".$obj->limit); $outp = array(); $outp = $result->fetch_all(MYSQLI_ASSOC); echo json_encode($outp); ?>

Работа с JSON средствами PHP

JSON (JavaScript Object Notation) – формат обмена данными, основанный на языке JavaScript, который представляет собой набор пар <ключ: значение>. Значение при этом может быть массивом, числом, строкой и булевым значением, что позволяет передавать сложные структурные данные в виде текста, быстро и удобно. Поддерживается большинством языков программирования.

В PHP поддержка формата JSON появилась с версии 5.2.0 и работает только с кодировкой UTF-8.

Преобразование массива в JSON

Самый распространёнными данными передаваемыми в виде JSON в php являются массивы. Для преобразования массива в JSON используется функция json_encode(). Принимает 3 аргумента, сам массив и специальный флаг (битовая маска) влияющий на то, как функция будет обрабатывать данные внутри массива, а так же целое число устанавливающее максимальную глубину, по умолчанию 512 ( за 10 лет практики ни разу не приходилось пользоваться этим аргументом).

 //Данные пользователя $user = [ 'name' => 'Макс', 'age' => 25, 'contacts' => [ 'email' => 'example@mail.com', 'phone' => '+71112225566' ] ]; $json = json_encode($user, JSON_UNESCAPED_UNICODE); echo $json; 

В данном примере я использовал флаг JSON_UNESCAPED_UNICODE он нужен для того, чтобы кириллица передавалась в человекочитаемом виде, а не кодировалась.

Декодирование JSON строки

Функция json_encode() преобразует строку в PHP-объект. Допустим в наш скрипт пришла JSON строка с формы записи на приём:

 ,"msg":"Добрый день! \nЯ бы хотел записаться на приём к стоматологу","time":"14.01.2023 15:09:08","doctor":"Иванова А.М. - врач стоматолог"> 

Чтобы преобразовать её в php ассоциативный массив (наиболее удобный формат для работы с такими данными) нужно вызвать json_encode() передав первым аргументом строку, вторым булеву true .

 $json = ',"msg":"Добрый день! Я бы хотел записаться на приём к стоматологу","time":"14.01.2023 15:25:01","doctor":"Иванова А.М. - врач стоматолог">'; $data = json_decode($json, true); echo '
'; print_r($data); echo '

';

 Array ( [name] => Николай [age] => 35 [contacts] => Array ( [email] => example@mail.com [phone] => +75558885566 ) [msg] => Добрый день! Я бы хотел записаться на приём к стоматологу [time] => 14.01.2023 15:25:01 [doctor] => Иванова А.М. - врач стоматолог ) 

HTTP запрос в формате JSON

Большинство сервисов предоставляющих API для работы с данными, требуют чтобы запросы к ним осуществлялись в формате JSON. Сделать такой запрос можно при помощи cURL PHP передав в качестве заголовков CURLOPT_HTTPHEADER массив с ‘Content-Type: application/json’ .

 //Подготовка даных $data = [ 'user' => 'test@yandex.ru' 'method' => 'getData', ]; //Инициализируем cURL сеанс $ch = curl_init('https://metrika.yandex.ru'); //Устанавливаем заголовки curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_POST, 1); //Передаём данные методом POST в формате JSON curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); //Передача $res = curl_exec($ch); //Закрываем сеанс curl_close($ch); 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *