JSON (JavaScript Object Notation) - текстовый формат обмена данными, основанный на JavaScript. При этом формат независим от JS и может использоваться в любом языке программирования. Формат представляет собой набор данных в виде {ключ: значение}. Значение может быть массивом, числом, строкой или булевым значением.

В вебе json в основном используется при ajax-запросах и взаимодействии с различными API.

Кодирование в JSON

Для кодирования массива данных или объекта в PHP используется функция json_encode

json_encode(mixed $value, int $flags = 0, int $depth = 512) - возвращает JSON-представление данных

Функция имеет один обязательный параметр: value - значение (массив или объект), которое будет закодировано. С помощью параметра flags можно задавать различные параметры влияющие на кодирование.

Пример:

$arr = array('a' => 'эй', 'b' => 'би', 'c' => 'си', 'd' => 'ди');
echo json_encode($arr);

Результат:

 {"a":"\u044d\u0439","b":"\u0431\u0438","c":"\u0441\u0438","d":"\u0434\u0438"} 

Из результата видно, что кириллица кодируется. Чтобы исправить необходимо добавить опцию JSON_UNESCAPED_UNICODE:

$arr = array('a' => 'эй', 'b' => 'би', 'c' => 'си', 'd' => 'ди');
echo json_encode($arr, JSON_UNESCAPED_UNICODE);

Результат:

 {"a":"эй","b":"би","c":"си","d":"ди"}

Декодирование

Функция json_decode($json) преобразует строку в объект.

json_decode(string $json, ?bool $associative = null, int $depth = 512, int $flags = 0) - принимает закодированную в JSON строку и преобразует её в PHP-значение.

Функция имеет один обязательный параметр: json - строка для декодирования. associative - если true, объекты JSON будут возвращены как ассоциативные массивы (array), если false, объекты JSON будут возвращены как объекты (object)

$json = '{"a":"эй","b":"би","c":"си","d":"ди"}';
$result = json_decode($json);
print_r($result);

Результат:

stdClass Object
(
    [a] => эй
    [b] => би
    [c] => си
    [d] => ди
)

Если вторым аргументом добавить true, то в результате получим массив:

$json = '{"a":"эй","b":"би","c":"си","d":"ди"}';
$result = json_decode($json, true);
print_r($result);

Результат:

Array
(
    [a] => эй
    [b] => би
    [c] => си
    [d] => ди
)

Получение ошибок

В случае ошибки, функция json_decode возвращает NULL. Ошибки возникают если json не может быть преобразован. Посмотреть ошибку можно с помощью функции json_last_error.

json_last_error() - возвращает последнюю ошибку (если она есть), произошедшую во время последнего кодирования/декодирования JSON.

Пример:

$json = '{"a:"эй"}';
$array = json_decode($json);
 
switch (json_last_error()) {
	case JSON_ERROR_NONE:
		echo 'Ошибок нет';
	break;
	case JSON_ERROR_DEPTH:
		echo 'Достигнута максимальная глубина стека';
	break;
	case JSON_ERROR_STATE_MISMATCH:
		echo 'Неверный или некорректный JSON';
	break;
	case JSON_ERROR_CTRL_CHAR:
		echo 'Ошибка управляющего символа, возможно неверная кодировка';
	break;
	case JSON_ERROR_SYNTAX:
		echo 'Синтаксическая ошибка';
	break;
	case JSON_ERROR_UTF8:
		echo 'Некорректные символы UTF-8, возможно неверная кодировка';
	break;
    case JSON_ERROR_RECURSION:
		echo 'Одна или несколько зацикленных ссылок в кодируемом значении';
	break;
    case JSON_ERROR_INF_OR_NAN:
		echo 'Одно или несколько значений NAN или INF в кодируемом значении';
	break;
    case JSON_ERROR_UNSUPPORTED_TYPE:
		echo 'Передано значение с неподдерживаемым типом';
	break;
    case JSON_ERROR_INVALID_PROPERTY_NAME:
		echo 'Имя свойства не может быть закодировано';
	break;
    case JSON_ERROR_UTF8:
		echo 'Некорректный символ UTF-16, возможно некорректно закодирован';
	break;
	default:
		echo 'Неизвестная ошибка';
	break;
}