PHP / JSON үйлдлүүд

JSON үйлдлүүд

Орчин үеийн вэб хөгжүүлэлтэд JSON (JavaScript Object Notation) бол өгөгдөл солилцооны стандарт формат болсон. REST API-аас өгөгдөл авах, JavaScript front-end-тэй харилцах, тохиргоо хадгалах — бүгдэнд JSON хэрэглэдэг. PHP нь JSON-тэй ажиллах json_encode() ба json_decode() гэсэн хоёр гол функцтэй. Эдгээр нь маш хялбар боловч дэлгэрэнгүй ойлгох нь мэргэжлийн код бичихэд чухал.

json_encode() — PHP-ийг JSON болгох

PHP-н массив эсвэл объектыг JSON мөр болгон хөрвүүлнэ:

php
<?php
// Жирийн массив
$өгөгдөл = [
    'нэр'    => 'Болд',
    'нас'    => 25,
    'хот'    => 'Улаанбаатар',
    'идэвхтэй' => true,
    'дүн'    => null,
];

$json = json_encode($өгөгдөл);
echo $json;
// {"нэр":"Болд","нас":25,"хот":"Улаанбаатар","идэвхтэй":true,"дүн":null}

// Уншихад тохиромжтой форматтай хэвлэх
$гоё = json_encode($өгөгдөл, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $гоё;
/*
{
    "нэр": "Болд",
    "нас": 25,
    "хот": "Улаанбаатар",
    "идэвхтэй": true,
    "дүн": null
}
*/

// Дотор массивтай — жагсаалт
$хэрэглэгч = [
    'id'     => 1,
    'нэр'    => 'Болд',
    'дүрүүд' => ['admin', 'editor'],
    'хаяг'   => [
        'хот'   => 'Улаанбаатар',
        'дүүрэг' => 'Сүхбаатар',
    ],
];

echo json_encode($хэрэглэгч, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
?>

JSON_UNESCAPED_UNICODE нь Монгол, Хятад зэрэг Unicode тэмдэгтүүдийг \u0411 хэлбэрт оруулахгүйгээр шууд хэвлэдэг — Монгол текстэй ажиллахад заавал хэрэглэх тугийг юм.

json_decode() — JSON-ийг PHP болгох

JSON мөрийг PHP массив эсвэл объект болгон хөрвүүлнэ:

php
<?php
$json = '{"нэр":"Болд","нас":25,"дүрүүд":["admin","editor"]}';

// Объект болгон хөрвүүлэх (анхдагч)
$объект = json_decode($json);
echo $объект->нэр;       // Болд
echo $объект->дүрүүд[0]; // admin

// Массив болгон хөрвүүлэх (хоёрдогч параметр true)
$массив = json_decode($json, true);
echo $массив['нэр'];       // Болд
echo $массив['дүрүүд'][0]; // admin

// Гүнзгий дотор бүтэцтэй JSON
$json2 = '{
    "бүтээгдэхүүнүүд": [
        {"id": 1, "нэр": "Утас", "үнэ": 1200000},
        {"id": 2, "нэр": "Чихэвч", "үнэ": 45000}
    ],
    "нийт": 2
}';

$өгөгдөл = json_decode($json2, true);
echo "Нийт бүтээгдэхүүн: " . $өгөгдөл['нийт'] . "\n";

foreach ($өгөгдөл['бүтээгдэхүүнүүд'] as $бараа) {
    echo "{$бараа['нэр']}: " . number_format($бараа['үнэ']) . "₮\n";
}
?>

Практикт true параметртэй массив болгон авах нь илүү түгээмэл — PHP массивтай ажиллах нь объекттой ажиллахаас хялбар байдаг.

Алдааг зохицуулах

json_decode() нь буруу JSON ирэхэд null буцаадаг. json_last_error() функцээр алдааны дэлгэрэнгүй мэдээллийг авна:

php
<?php
function аюулгүй_json_задлах(string $json): array {
    $өгөгдөл = json_decode($json, true);

    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new InvalidArgumentException(
            "JSON задлах алдаа: " . json_last_error_msg()
        );
    }

    if (!is_array($өгөгдөл)) {
        throw new InvalidArgumentException("JSON массив байх ёстой.");
    }

    return $өгөгдөл;
}

// Зөв JSON
try {
    $өгөгдөл = аюулгүй_json_задлах('{"нэр":"Болд"}');
    echo $өгөгдөл['нэр']; // Болд
} catch (InvalidArgumentException $e) {
    echo "Алдаа: " . $e->getMessage();
}

// Буруу JSON
try {
    $өгөгдөл = аюулгүй_json_задлах('{буруу json}');
} catch (InvalidArgumentException $e) {
    echo "Алдаа: " . $e->getMessage();
    // Алдаа: JSON задлах алдаа: Syntax error
}
?>

JSON API хариу бэлдэх

PHP back-end нь JavaScript front-end-д JSON форматаар өгөгдөл буцаах нь орчин үеийн вэб хөгжүүлэлтийн гол хэв маяг юм:

php
<?php
// api/хэрэглэгчид.php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');

function json_хариу(mixed $өгөгдөл, int $статус = 200): never {
    http_response_code($статус);
    echo json_encode($өгөгдөл, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit;
}

function json_алдаа(string $мэдэгдэл, int $статус = 400): never {
    json_хариу(['алдаа' => true, 'мэдэгдэл' => $мэдэгдэл], $статус);
}

// Жишээ endpoint
$арга = $_SERVER['REQUEST_METHOD'];
$id   = isset($_GET['id']) ? (int)$_GET['id'] : null;

if ($арга === 'GET') {
    if ($id !== null) {
        // Нэг хэрэглэгч авах
        $хэрэглэгчид = [1 => ['id' => 1, 'нэр' => 'Болд', 'имэйл' => 'bold@example.mn']];

        if (!isset($хэрэглэгчид[$id])) {
            json_алдаа("Хэрэглэгч олдсонгүй.", 404);
        }

        json_хариу(['амжилт' => true, 'өгөгдөл' => $хэрэглэгчид[$id]]);
    }

    // Бүгдийг буцаах
    json_хариу([
        'амжилт'  => true,
        'нийт'    => 3,
        'өгөгдөл' => [
            ['id' => 1, 'нэр' => 'Болд'],
            ['id' => 2, 'нэр' => 'Сарнай'],
            ['id' => 3, 'нэр' => 'Тамир'],
        ],
    ]);
}

if ($арга === 'POST') {
    $биеийн_өгөгдөл = file_get_contents('php://input');
    $шинэ = json_decode($биеийн_өгөгдөл, true);

    if (json_last_error() !== JSON_ERROR_NONE) {
        json_алдаа("Хүчингүй JSON.");
    }

    if (empty($шинэ['нэр'])) {
        json_алдаа("Нэр шаардлагатай.");
    }

    // Хадгалах логик...
    json_хариу(['амжилт' => true, 'id' => 4], 201);
}
?>

file_get_contents('php://input') нь POST хүсэлтийн биеийн өгөгдлийг ($_POST биш) цэвэр байдлаар уншдаг — JSON илгээсэн REST клиент ашиглахад заавал энийг хэрэглэнэ.

Дараагийн хичээлд:

HTTP header-уудыг судална. header() функцээр хариуны статус код, чиглүүлэлт, агуулгын төрөл, кэш тохируулалт хэрхэн тохируулдгийг жишээгээр тайлбарлана.