JSON в PHP
В этом уроке вы узнаете, как кодировать и декодировать данные JSON в PHP.
Что такое JSON
JSON расшифровывается как аббревиатура от J ava S cript O bject N otation. JSON — это стандартный текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}.
В JSON, ключи всегда строки, в то время как значение может быть string
, number
, true
или false
, null
, object
или array
. Строки должны быть заключены в двойные кавычки "
и могут содержать управляющие символы, такие как \n
, \t
и \
. JSON более компактный, чем xml, поэтому он более предпочтителен для обмена данными между веб-браузером и сервером.
Синтаксис JSON на примерах
Объект JSON может выглядеть так:
Пример
{
"ФИО" : "Иванов Иван",
"Адрес" : {
"Город" : "Киров",
"Улица" : "Вербицкого",
"Дом" : "7"
}
}
В то время как пример массива JSON будет выглядеть примерно так:
Пример
{
"smarts": [
"Apple",
"ASUS",
"Huawei",
"Lenovo"
]
}
PHP и JSON
Структуры данных JSON очень похожи на массивы PHP. В языке PHP существуют специальные функции для кодирования и декодирования данных JSON. Это функции json_encode()
и json_decode()
соответственно. Они уже встроены в ядро PHP, поэтому никаких библиотек подключать не нужно. Обе функции работают только со строковыми данными в кодировке UTF-8.
Кодирование данных JSON в PHP
В PHP функция json_encode()
используется для кодирования значения в формат JSON. Кодируемое значение может быть любым типом данных PHP, кроме ресурса, такого как база данных или дескриптор файла.
Синтаксис
Параметры
value
- - значение, которое будет закодировано. Может быть любого типа за исключением resource. Все строковые данные должны быть в кодировке UTF-8.
options
- Битовая маска составляемая из значений
JSON_HEX_QUOT
,JSON_HEX_TAG
,JSON_HEX_AMP
,JSON_HEX_APOS
,JSON_NUMERIC_CHECK
,JSON_PRETTY_PRINT
,JSON_UNESCAPED_SLASHES
,JSON_FORCE_OBJECT
,JSON_UNESCAPED_UNICODE
. depth
- Задает максимальную глубину. Должен быть больше нуля.
В приведенном ниже примере показано, как кодировать ассоциативный массив PHP в объект JSON:
Пример
Попробуй сам »<?php
// ассоциативный массив
$marks = array("Peter"=>65, "Harry"=>80, "John"=>78, "Clark"=>90);
echo json_encode($marks);
?>
Результат приведенного выше примера будет выглядеть так:
В следующем примере посмотрим, как будут кодироваться кириллические символы:
Пример
Попробуй сам »<?php
// ассоциативный массив
$marks = array("Пётр"=>65, "Игорь"=>80, "Денис"=>78, "Николай"=>90);
echo json_encode($marks);
?>
Результат приведенного выше примера будет выглядеть так:
Как видно кириллица кодируется, исправляется это добавлением опции: JSON_UNESCAPED_UNICODE
.
Пример
Попробуй сам »<?php
$marks = array("Пётр"=>65, "Игорь"=>80, "Денис"=>78, "Николай"=>90);
echo json_encode($marks, JSON_UNESCAPED_UNICODE);
?>
Результат выполнения кода:
Точно так же вы можете закодировать индексированный массив PHP в массив JSON, например:
В следующем примере посмотрим, как будут кодироваться кириллические символы:
Пример
Попробуй сам »<?php
// индексированный массив
$colors = array("Красный", "Зелёный", "Синий", "Оранжевый", "Жёлтый");
echo json_encode($colors, JSON_UNESCAPED_UNICODE);
?>
Результат выполнения кода:
Если применить параметр JSON_FORCE_OBJECT
, то функция json_encode()
будет
возвращать индексированный массив PHP как объект JSON:
Пример
Попробуй сам »<?php
// индексированный массив
$smarts = array("Apple", "ASUS", "Huawei", "Lenovo", "Samsung");
echo json_encode($smarts, JSON_FORCE_OBJECT);
?>
Результат выполнения кода:
Примечание: Неассоциативный массив может быть закодирован как массив или объект. Однако ассоциативный массив всегда кодируется как объект.
Декодирование данных JSON в PHP
Функция PHP json_decode()
используется для декодирования JSON в PHP. Эта функция возвращает значение, декодированное из json в соответствующий тип данных PHP.
Синтаксис
Параметры
json
- - json строка (string) для декодирования. Эта функция работает только со строками в UTF-8 кодировке.
assoc
- Если TRUE, возвращаемые объекты будут преобразованы в ассоциативные массивы.
depth
- Указывает глубину рекурсии.
options
- Битовая маска опций декодирования JSON. В настоящий момент поддерживается только JSON_BIGINT_AS_STRING (по умолчанию большие целые числа приводятся к числам с плавающей запятой (float))
В следующем примере показано, как декодировать или преобразовать объект JSON в объект PHP:
Пример
Попробуй сам »<?php
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
var_dump(json_decode($json));
?>
Результат выполнения кода:
Функция json_decode()
по умолчанию возвращает объект. Если нужно JSON декодировать в ассоциативный массив, то укажите значение второго параметра $assoc
в качестве true
. По умолчанию его значение — false
:
Пример
Попробуй сам »<?php
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
var_dump(json_decode($json, true));
?>
Результат выполнения кода:
Доступ к декодированным значениям JSON в PHP
Теперь рассмотрим пример, который показывает, как декодировать данные JSON и получить доступ к отдельным элементам объекта JSON в PHP:
Пример
Попробуй сам »<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';
$obj = json_decode($jsonobj);
// Доступ к значениям из возвращенного объекта
echo $obj->Peter; // вывод 35
echo $obj->Ben; // вывод 37
echo $obj->Joe; // вывод 43
?>
В этом примере показано, как получить доступ к отдельным элементам ассоциативного массива PHP:
Пример
Попробуй сам »<?php
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
$arr = json_decode($json, true);
// Доступ к значениям из ассоциативного массива
echo $arr["Peter"]; // вывод: 65
echo $arr["Harry"]; // вывод: 80
echo $arr["John"]; // вывод: 78
echo $arr["Clark"]; // вывод: 90
?>
Вы также можете перебирать декодированные данные с помощью цикла foreach(), например:
Пример
Попробуй сам »<?php
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
// Декодирование данных JSON в ассоциативный массив PHP
$arr = json_decode($json, true);
// Перебираем ассоциативный массив
foreach($arr as $key=>$value){
echo $key . "=>" . $value . "<br>";
}
echo "<hr>";
// Декодируем данные JSON в объект PHP
$obj = json_decode($json);
// Перебираем в цикле значения объекта
foreach($obj as $key=>$value){
echo $key . "=>" . $value . "<br>";
}
?>
Извлечение значений из вложенных данных JSON в PHP
Объекты и массивы JSON также могут быть вложенными. Объект JSON может содержать другие объекты JSON, массивы, вложенные массивы, массивы объектов JSON и т.д. В следующем примере показано, как декодировать вложенный объект JSON и распечатать все его значения в PHP:
<?php
// Определим рекурсивную функцию для извлечения вложенных значений
function printValues($arr) {
global $count;
global $values;
// Проверка условия: если это не массив
if(!is_array($arr)){
die("ОШИБКА: Это не массив");
}
/*
Прокручиваем в цикле массив, если значение само по себе является массивом, рекурсивно вызываем функцию else добавляет найденное значение в массив элементов вывода, и увеличивает счетчик на 1 для каждого найденного значения
*/
foreach($arr as $key=>$value){
if(is_array($value)){
printValues($value);
} else{
$values[] = $value;
$count++;
}
}
// Возвращает общее количество и значения, найденные в массиве
return array('total' => $count, 'values' => $values);
}
// Назначаем закодированную строку JSON переменной PHP
$json = '{
"book": {
"name": "Harry Potter and the Goblet of Fire",
"author": "J. K. Rowling",
"year": 2000,
"characters": ["Harry Potter", "Hermione Granger", "Ron Weasley"],
"genre": "Fantasy Fiction",
"price": {
"paperback": "$10.40", "hardcover": "$20.32", "kindle": "4.11"
}
}
}';
// Декодирование данных JSON в формат ассоциативного массива PHP
$arr = json_decode($json, true);
// Вызвать функцию и распечатать все значения
$result = printValues($arr);
echo "<h3>" . $result["total"] . " value(s) found: </h3>";
echo implode("<br>", $result["values"]);
echo "<hr>";
// Вывести одно значение
echo $arr["book"]["author"] . "<br>"; // Вывод: J.K. Rowling
echo $arr["book"]["characters"][0] . "<br>"; // Вывод: Harry Potter
echo $arr["book"]["price"]["hardcover"]; // Вывод: $20.32
?>