Json encode: примеры (PHP)

Кодирование структур данных в формат JSON при помощи функции json_encode
Раздел: JSON
json_encode(mixed $value, int $flags = 0, int $depth = 512): string|false
Функция json_encode в PHP

Функция json_encode преобразует значение PHP в строку JSON. Она используется при передаче данных между клиентом и сервером, сохранении структур данных или обмене информацией между системами.

Аргументы функции

value (обязательный) - значение для кодирования. Может быть любого типа, кроме ресурса.

flags (опционально) - битовая маска констант для изменения поведения кодирования. По умолчанию 0.

depth (опционально) - максимальная глубина рекурсии при кодировании. По умолчанию 512.

Флаги функции

JSON_HEX_TAG - преобразует < и > в \u003C и \u003E.

JSON_HEX_AMP - преобразует & в \u0026.

JSON_HEX_APOS - преобразует ' в \u0027.

JSON_HEX_QUOT - преобразует " в \u0022.

JSON_FORCE_OBJECT - кодирует массив как объект.

JSON_NUMERIC_CHECK - преобразует строки с числами в числа.

JSON_PRETTY_PRINT - форматирует JSON с отступами.

JSON_UNESCAPED_SLASHES - не экранирует /.

JSON_UNESCAPED_UNICODE - не экранирует символы Unicode.

JSON_THROW_ON_ERROR - выбрасывает исключение при ошибке.

Примеры использования json_encode
Базовое кодирование
$data = ['name' => 'Иван', 'age' => 30];
echo json_encode($data);
{"name":"\u0418\u0432\u0430\u043d","age":30}
Флаг JSON_UNESCAPED_UNICODE
echo json_encode($data, JSON_UNESCAPED_UNICODE);
{"name":"Иван","age":30}
Флаг JSON_PRETTY_PRINT
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
{
    "name": "Иван",
    "age": 30
}
Флаг JSON_FORCE_OBJECT
$array = ['яблоко', 'банан'];
echo json_encode($array, JSON_FORCE_OBJECT);
{"0":"\u044f\u0431\u043b\u043e\u043a\u043e","1":"\u0431\u0430\u043d\u0430\u043d"}
Флаг JSON_NUMERIC_CHECK
$data = ['price' => '100', 'discount' => '25.5'];
echo json_encode($data, JSON_NUMERIC_CHECK);
{"price":100,"discount":25.5}
Похожие функции в PHP

Обратная функция для декодирования строки JSON в структуры PHP. Используется, когда требуется преобразовать полученные JSON-данные обратно в объекты или массивы.

serialize и unserialize

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

var_export

Выводит или возвращает строковое представление переменной в виде валидного PHP-кода. Подходит для сохранения данных, которые будут позже включены в PHP-скрипт.

Аналоги в других языках

Json encode в Javascript

const obj = {name: 'Иван', age: 30};
const json = JSON.stringify(obj);
console.log(json);
{"name":"Иван","age":30}

Метод JSON.stringify выполняет аналогичное преобразование. Поддерживает параметр replacer и space для форматирования.

Json encode в Python

import json
data = {'name': 'Иван', 'age': 30}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
{"name": "Иван", "age": 30}

Функция json.dumps модуля json обеспечивает сходную функциональность. Параметр ensure_ascii=False аналогичен JSON_UNESCAPED_UNICODE.

Json encode в MySQL

SELECT JSON_OBJECT('name', 'Иван', 'age', 30);
{"name": "Иван", "age": 30}

Функция JSON_OBJECT создает JSON-объект из пар ключ-значение. В MySQL есть множество других JSON-функций для работы с JSON-данными непосредственно в запросах.

Типичные ошибки
Кодирование несовместимых типов
$resource = fopen('test.txt', 'r');
echo json_encode($resource);
null

Ресурсы не могут быть закодированы в JSON, функция возвращает null.

Рекурсивные ссылки
$arr = [1, 2, 3];
$arr[] = &$arr;
echo json_encode($arr);
false

При наличии циклических ссылок функция возвращает false.

Некорректная глубина
$data = [[['глубина']]];
echo json_encode($data, 0, 2);
false

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

Ошибки кодирования UTF-8
$str = "тест" . chr(200);
echo json_encode($str);
false

При наличии некорректных UTF-8 последовательностей функция может вернуть false.

Изменения в последних версиях PHP
PHP 7.3

Добавлены константы JSON_THROW_ON_ERROR, JSON_INVALID_UTF8_IGNORE, JSON_INVALID_UTF8_SUBSTITUTE.

PHP 7.2

Добавлена константа JSON_INVALID_UTF8_IGNORE.

PHP 7.1

Добавлена константа JSON_UNESCAPED_LINE_TERMINATORS.

PHP 8.0

Параметр depth по умолчанию изменен с 512 на 2147483647. Константа JSON_THROW_ON_ERROR теперь может использоваться для генерации исключений при ошибках.

Расширенные примеры
Кодирование объектов с методами
Пример php
class User {
    private $name = 'Мария';
    public $age = 25;
    public function getName() {
        return $this->name;
    }
}
$user = new User();
echo json_encode($user);
{"age":25}

Кодируются только публичные свойства объекта.

Использование JsonSerializable
Пример php
class Product implements JsonSerializable {
    private $id = 100;
    private $name = 'Товар';
    public function jsonSerialize() {
        return ['id' => $this->id, 'title' => $this->name];
    }
}
echo json_encode(new Product());
{"id":100,"title":"Товар"}

Интерфейс позволяет контролировать данные при сериализации в JSON.

Обработка ошибок с JSON_THROW_ON_ERROR
Пример php
try {
    $data = ["\x80"];
    echo json_encode($data, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
Ошибка: Malformed UTF-8 characters, possibly incorrectly encoded
Комбинация нескольких флагов
Пример php
$data = ['tag' => '
', 'path' => '/root/file', 'price' => '99.9']; echo json_encode($data, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT );
{
    "tag": "\u003Cdiv\u003E",
    "path": "/root/file",
    "price": 99.9
}
Кодирование многомерных структур
Пример php
$company = [
    'name' => 'Компания',
    'departments' => [
        ['title' => 'Отдел продаж', 'employees' => 5],
        ['title' => 'Разработка', 'employees' => 12]
    ],
    'tags' => ['IT', 'service']
];
echo json_encode($company, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
{
    "name": "Компания",
    "departments": [
        {
            "title": "Отдел продаж",
            "employees": 5
        },
        {
            "title": "Разработка",
            "employees": 12
        }
    ],
    "tags": [
        "IT",
        "service"
    ]
}

PHP json_encode function comments

En
Json encode Returns the JSON representation of a value