Working with JSON Data: json_encode and json_decode
ในโลกของการพัฒนาเว็บแอปพลิเคชัน การแลกเปลี่ยนข้อมูลระหว่าง client (เช่น browser) และ server เป็นสิ่งจำเป็นอย่างยิ่ง รูปแบบข้อมูลที่ได้รับความนิยมและใช้งานกันอย่างแพร่หลายคือ JSON (JavaScript Object Notation) ซึ่งเป็นรูปแบบข้อมูลที่มีโครงสร้างที่อ่านง่าย ทั้งสำหรับมนุษย์และเครื่องจักร บทความนี้จะพาคุณไปรู้จักกับการทำงานกับข้อมูล JSON ใน PHP โดยใช้ฟังก์ชัน json_encode() และ json_decode()
JSON คืออะไร?
JSON เป็นรูปแบบข้อมูลที่มีโครงสร้างคล้ายกับ object ใน JavaScript ประกอบไปด้วยคู่ของ key-value โดยที่ key เป็น string และ value สามารถเป็นได้ทั้ง string, number, boolean, null, array หรือ object อื่นๆ (nested object) ตัวอย่าง JSON:
{
"name": "John Doe",
"age": 30,
"city": "New York",
"skills": ["PHP", "JavaScript", "SQL"]
}
การ Encode PHP Array เป็น JSON String ด้วย json_encode()
ฟังก์ชัน json_encode() ใน PHP ใช้สำหรับแปลง PHP array หรือ object ให้เป็น JSON string ซึ่งเป็นรูปแบบข้อมูลที่สามารถส่งไปยัง client หรือบันทึกลงในไฟล์ได้
รูปแบบการใช้งาน:
string json_encode(mixed $value, int $options = 0, int $depth = 512): string|false
$value: ข้อมูลที่ต้องการ encode (array หรือ object)$options: (Optional) Bitmask ของ JSON encode options (เช่นJSON_PRETTY_PRINT,JSON_UNESCAPED_UNICODE)$depth: (Optional) Maximum nesting depth. ต้องมากกว่า 0
ตัวอย่าง:
<code class="language-php">
<?php
$data = [
"name" => "Jane Smith",
"age" => 25,
"city" => "London",
"skills" => ["PHP", "HTML", "CSS"]
];
$json_string = json_encode($data);
echo $json_string; // Output: {"name":"Jane Smith","age":25,"city":"London","skills":["PHP","HTML","CSS"]}
// เพิ่ม option JSON_PRETTY_PRINT เพื่อให้อ่านง่ายขึ้น
$pretty_json_string = json_encode($data, JSON_PRETTY_PRINT);
echo "<br><pre>" . $pretty_json_string . "";
/* Output:
{
"name": "Jane Smith",
"age": 25,
"city": "London",
"skills": [
"PHP",
"HTML",
"CSS"
]
}
*/
// เพิ่ม option JSON_UNESCAPED_UNICODE สำหรับภาษาไทย
$thai_data = ["name" => "สมชาย", "age" => 30];
$thai_json = json_encode($thai_data, JSON_UNESCAPED_UNICODE);
echo "" . $thai_json; // Output: {"name":"สมชาย","age":30} ?>
เหตุผลเชิงออกแบบและแนวปฏิบัติที่ดี:
- การเลือก Options ที่เหมาะสม: พิจารณา options ของ
json_encode()อย่างรอบคอบ เช่นJSON_PRETTY_PRINTสำหรับการ debug หรือJSON_UNESCAPED_UNICODEสำหรับภาษาที่มีอักขระพิเศษ - การจัดการ Error:
json_encode()อาจ returnfalseหากเกิด error ในการ encode ควรตรวจสอบค่าที่ return และจัดการ error ให้เหมาะสม - ความลึกของ Nesting: กำหนด
depthหาก array มี nesting ที่ลึกมากเกินไป เพื่อป้องกันปัญหา performance
การ Decode JSON String เป็น PHP Array ด้วย json_decode()
ฟังก์ชัน json_decode() ใน PHP ใช้สำหรับแปลง JSON string กลับเป็น PHP array หรือ object ซึ่งช่วยให้เราสามารถนำข้อมูลจาก JSON มาใช้งานใน PHP ได้
รูปแบบการใช้งาน:
mixed json_decode(string $json, bool $associative = false, int $depth = 512, int $options = 0): mixed|null
$json: JSON string ที่ต้องการ decode$associative: (Optional) หากเป็นtrueจะ return เป็น associative array หากเป็นfalse(ค่า default) จะ return เป็น object$depth: (Optional) Maximum nesting depth. ต้องมากกว่า 0$options: (Optional) Bitmask ของ JSON decode options (เช่นJSON_BIGINT_AS_STRING)
ตัวอย่าง:
<?php
$json_string = '{"name":"Jane Smith","age":25,"city":"London","skills":["PHP","HTML","CSS"]}';
// Decode เป็น associative array
$data_array = json_decode($json_string, true);
echo $data_array["name"]; // Output: Jane Smith
echo "<br>";
// Decode เป็น object
$data_object = json_decode($json_string);
echo $data_object->name; // Output: Jane Smith
echo "<br>";
// การวนลูปผ่าน skills ใน associative array
echo "Skills: ";
foreach ($data_array["skills"] as $skill) {
echo $skill . ", ";
}
echo "<br>";
// การวนลูปผ่าน skills ใน object
echo "Skills: ";
foreach ($data_object->skills as $skill) {
echo $skill . ", ";
}
echo "<br>";
//จัดการ error กรณี JSON ไม่ถูกต้อง
$invalid_json = '{"name":"Jane Smith",age:25}'; //age ไม่มี quote
$data = json_decode($invalid_json, true);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
echo "Error decoding JSON: " . json_last_error_msg();
}
?>
เหตุผลเชิงออกแบบและแนวปฏิบัติที่ดี:
- การเลือก Associative Array หรือ Object: เลือกรูปแบบที่เหมาะสมกับการใช้งาน หากต้องการเข้าถึงข้อมูลด้วย index ที่เป็น string ให้ใช้ associative array หากต้องการเข้าถึงข้อมูลด้วย object properties ให้ใช้ object
- การจัดการ Error:
json_decode()อาจ returnnullหาก JSON string ไม่ถูกต้อง ควรตรวจสอบค่าที่ return และใช้json_last_error()และjson_last_error_msg()เพื่อตรวจสอบ error - การจัดการ Data Types: ระวังเรื่อง data types โดยเฉพาะตัวเลขขนาดใหญ่ หากต้องการให้ตัวเลขขนาดใหญ่ถูก decode เป็น string ให้ใช้ option
JSON_BIGINT_AS_STRING
การใช้งาน JSON กับ API
JSON เป็นรูปแบบข้อมูลที่นิยมใช้ในการสร้าง API (Application Programming Interface) เนื่องจากมีความยืดหยุ่นและง่ายต่อการ parse ทั้งในฝั่ง client และ server ตัวอย่างการใช้งาน JSON กับ API:
ฝั่ง Server (PHP):
<?php
// กำหนด header เป็น JSON
header('Content-Type: application/json');
$data = [
"id" => 123,
"product_name" => "Awesome Product",
"price" => 99.99
];
// Encode ข้อมูลเป็น JSON
$json_response = json_encode($data);
// ส่ง JSON response กลับไปยัง client
echo $json_response;
?>
ฝั่ง Client (JavaScript):
fetch('/api/product')
.then(response => response.json())
.then(data => {
console.log(data.product_name); // Output: Awesome Product
})
.catch(error => {
console.error('Error:', error);
});
Trade-offs และแนวปฏิบัติที่ดี:
- Content-Type Header: กำหนด
Content-Typeheader เป็นapplication/jsonเพื่อบอก client ว่า response เป็น JSON - Error Handling: จัดการ error ที่อาจเกิดขึ้นในการสร้าง JSON response และส่ง error message กลับไปยัง client ในรูปแบบ JSON
- API Documentation: สร้าง documentation ที่ชัดเจนเกี่ยวกับรูปแบบ JSON ที่ API return เพื่อให้ client สามารถใช้งาน API ได้อย่างถูกต้อง
การทำงานกับ JSON เป็นทักษะที่สำคัญในการพัฒนาเว็บแอปพลิเคชันสมัยใหม่ การเข้าใจวิธีการ encode และ decode ข้อมูล JSON ใน PHP จะช่วยให้คุณสามารถสร้าง API ที่มีประสิทธิภาพและแลกเปลี่ยนข้อมูลกับ client ได้อย่างราบรื่น ในบทความถัดไป เราจะเรียนรู้เกี่ยวกับการสร้าง API endpoint อย่างง่ายด้วย PHP