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