PHP Cơ bản
PHP Nâng cao
PHP & Cơ sở dữ liệu MySQL
Ví dụ PHP
Tài liệu tham khảo PHP
Quảng cáo

Cú pháp JSON trong PHP

Trong hướng dẫn này, bạn sẽ học cách mã hóa và giải mã dữ liệu JSON trong PHP.

JSON là gì?

JSON là viết tắt của Java Script Object Notation. JSON là một định dạng trao đổi dữ liệu nhẹ tiêu chuẩn, nhanh chóng và dễ dàng để phân tích cú pháp và tạo.

JSON, giống như XML, là một định dạng dựa trên văn bản dễ viết và dễ hiểu cho cả người và máy tính, nhưng không giống như XML, cấu trúc dữ liệu JSON chiếm ít băng thông hơn các phiên bản XML của chúng. JSON dựa trên hai cấu trúc cơ bản:

  • Đối tượng: Đây được định nghĩa là một tập hợp các cặp khóa / giá trị (tức là key:value). Mỗi đối tượng bắt đầu bằng dấu ngoặc nhọn bên trái { và kết thúc bằng dấu ngoặc nhọn bên phải }. Nhiều cặp khóa / giá trị được phân tách bằng dấu phẩy ,.
  • Mảng: Đây được định nghĩa là một danh sách các giá trị có thứ tự. Một mảng bắt đầu bằng dấu ngoặc vuông bên trái [ và kết thúc bằng dấu ngoặc vuông bên phải ]. Các giá trị được phân tách bằng dấu phẩy ,.

Trong JSON, khóa luôn là chuỗi, trong khi giá trị có thể là một string, number, true hay false, null hoặc thậm chí một object hoặc một array. Các chuỗi phải được đặt trong dấu ngoặc kép " và có thể chứa các ký tự thoát như \n, \t và \. Một đối tượng JSON có thể trông giống như sau:

Ví dụ

{
    "book": {
        "name": "Harry Potter and the Goblet of Fire",
        "author": "J. K. Rowling",
        "year": 2000,
        "genre": "Fantasy Fiction",
        "bestseller": true
    }
}

Trong khi một ví dụ về mảng JSON sẽ trông giống như sau:

Ví dụ

{
    "fruits": [
        "Apple",
        "Banana",
        "Strawberry",
        "Mango"
    ]
}
 

Mẹo: Định dạng trao đổi dữ liệu là một định dạng văn bản được sử dụng để trao đổi hoặc trao đổi dữ liệu giữa các nền tảng và hệ điều hành khác nhau. JSON là định dạng trao đổi dữ liệu nhẹ và phổ biến nhất cho các ứng dụng web.

Phân tích cú pháp JSON với PHP

Cấu trúc dữ liệu JSON rất giống với mảng PHP. PHP có sẵn các hàm để mã hóa và giải mã dữ liệu JSON. Các chức năng này lần lượt là json_encode() json_decode(). Cả hai hàm chỉ hoạt động với dữ liệu chuỗi được mã hóa UTF-8.

Mã hóa dữ liệu JSON bằng PHP

Trong PHP, hàm json_encode() được sử dụng để mã hóa một giá trị sang định dạng JSON. Giá trị đang được mã hóa có thể là bất kỳ kiểu dữ liệu PHP nào ngoại trừ một tài nguyên, như cơ sở dữ liệu hoặc tệp xử lý. Ví dụ dưới đây trình bày cách mã hóa một mảng kết hợp PHP thành một đối tượng JSON:

Ví dụ

<?php
// An associative array
$marks = array("Peter"=>65, "Harry"=>80, "John"=>78, "Clark"=>90);
 
echo json_encode($marks);
?>

Kết quả của ví dụ trên sẽ giống như sau:

{"Peter": 65, "Harry": 80, "John": 78, "Clark": 90}

Tương tự, bạn có thể mã hóa mảng được lập chỉ mục PHP thành một mảng JSON, như sau:

Ví dụ

<?php
// An indexed array
$colors = array("Red", "Green", "Blue", "Orange", "Yellow");
 
echo json_encode($colors);
?>

Kết quả của ví dụ trên sẽ giống như sau:

["Red", "Green", "Blue", "Orange", "Yellow"]

Bạn cũng có thể buộc hàm json_encode() trả về một mảng được lập chỉ mục PHP dưới dạng đối tượng JSON bằng cách sử dụng tùy chọn JSON_FORCE_OBJECT, như được hiển thị trong ví dụ dưới đây:

Ví dụ

<?php
// An indexed array
$colors = array("Red", "Green", "Blue", "Orange");
 
echo json_encode($colors, JSON_FORCE_OBJECT);
?>

Kết quả của ví dụ trên sẽ giống như sau:

{"0": "Red", "1": "Green", "2": "Blue", "3": "Orange"}

Như bạn có thể thấy trong các ví dụ trên, một mảng không liên kết có thể được mã hóa dưới dạng mảng hoặc đối tượng. Tuy nhiên, một mảng kết hợp luôn được mã hóa dưới dạng đối tượng.

Giải mã dữ liệu JSON trong PHP

Giải mã dữ liệu JSON cũng đơn giản như mã hóa nó. Bạn có thể sử dụng hàm PHP json_decode() để chuyển đổi chuỗi được mã hóa JSON thành kiểu dữ liệu PHP thích hợp. Ví dụ sau đây trình bày cách giải mã hoặc chuyển đổi một đối tượng JSON thành đối tượng PHP .

Ví dụ

<?php
// Store JSON data in a PHP variable
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
 
var_dump(json_decode($json));
?>

Kết quả của ví dụ trên sẽ giống như sau:

object (stdClass) # 1 (4) {["Peter"] => int (65) ["Harry"] => int (80) ["John"] => int (78) ["Clark"] => int (90)}

Theo mặc định, hàm json_decode() trả về một đối tượng. Tuy nhiên, bạn có thể tùy ý chỉ định tham số thứ hai $assoc chấp nhận giá trị boolean mà khi được đặt  đối tượng là true JSON được giải mã thành các mảng kết hợp. Nó là false trả về theo mặc định. Đây là một ví dụ:

Ví dụ

<?php
// Store JSON data in a PHP variable
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
 
var_dump(json_decode($json, true));
?>

Kết quả của ví dụ trên sẽ giống như sau:

array (4) {["Peter"] => int (65) ["Harry"] => int (80) ["John"] => int (78) ["Clark"] => int (90)}

Bây giờ chúng ta hãy xem một ví dụ sẽ chỉ cho bạn cách giải mã dữ liệu JSON và truy cập các phần tử riêng lẻ của đối tượng hoặc mảng JSON trong PHP.

Ví dụ

<?php
// Assign JSON encoded string to a PHP variable
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
 
// Decode JSON data to PHP associative array
$arr = json_decode($json, true);
// Access values from the associative array
echo $arr["Peter"];  // Output: 65
echo $arr["Harry"];  // Output: 80
echo $arr["John"];   // Output: 78
echo $arr["Clark"];  // Output: 90
 
// Decode JSON data to PHP object
$obj = json_decode($json);
// Access values from the returned object
echo $obj->Peter;   // Output: 65
echo $obj->Harry;   // Output: 80
echo $obj->John;    // Output: 78
echo $obj->Clark;   // Output: 90
?>

Bạn cũng có thể lặp lại dữ liệu đã giải mã bằng vòng lặp foreach(), như sau:

Ví dụ

<?php
// Assign JSON encoded string to a PHP variable
$json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}';
 
// Decode JSON data to PHP associative array
$arr = json_decode($json, true);
 
// Loop through the associative array
foreach($arr as $key=>$value){
    echo $key . "=>" . $value . "<br>";
}
echo "<hr>";
// Decode JSON data to PHP object
$obj = json_decode($json);
 
// Loop through the object
foreach($obj as $key=>$value){
    echo $key . "=>" . $value . "<br>";
}
?>

Trích xuất giá trị từ dữ liệu JSON lồng nhau trong PHP

Các đối tượng và mảng JSON cũng có thể được lồng vào nhau. Một đối tượng JSON có thể tùy ý chứa các đối tượng JSON khác, mảng, mảng lồng nhau, mảng đối tượng JSON, v.v. Ví dụ sau sẽ chỉ cho bạn cách giải mã một đối tượng JSON lồng nhau và in tất cả các giá trị của nó trong PHP.

Ví dụ

<?php
// Define recursive function to extract nested values
function printValues($arr) {
    global $count;
    global $values;
    
    // Check input is an array
    if(!is_array($arr)){
        die("ERROR: Input is not an array");
    }
    
    /*
    Loop through array, if value is itself an array recursively call the
    function else add the value found to the output items array,
    and increment counter by 1 for each value found
    */
    foreach($arr as $key=>$value){
        if(is_array($value)){
            printValues($value);
        } else{
            $values[] = $value;
            $count++;
        }
    }
    
    // Return total count and values found in array
    return array('total' => $count, 'values' => $values);
}
 
// Assign JSON encoded string to a PHP variable
$json = '{
    "book": {
        "name": "Harry Potter and the Goblet of Fire",
        "author": "J. K. Rowling",
        "year": 2000,
        "characters": ["Harry Potter", "Hermione Granger", "Ron Weasley"],
        "genre": "Fantasy Fiction",
        "price": {
            "paperback": "$10.40", "hardcover": "$20.32", "kindle": "4.11"
        }
    }
}';
// Decode JSON data into PHP associative array format
$arr = json_decode($json, true);
 
// Call the function and print all the values
$result = printValues($arr);
echo "<h3>" . $result["total"] . " value(s) found: </h3>";
echo implode("<br>", $result["values"]);
 
echo "<hr>";
 
// Print a single value
echo $arr["book"]["author"] . "<br>";  // Output: J. K. Rowling
echo $arr["book"]["characters"][0] . "<br>";  // Output: Harry Potter
echo $arr["book"]["price"]["hardcover"];  // Output: $20.32
?>

Bài viết này đã giúp ích cho bạn?

Advertisements