JSON Parsing: Phân giải dữ liệu JSON với PHP

“Hãy hòa nhã với những kẻ dở hơi. Ai biết được ngày sau bạn có thể phải làm việc cho một kẻ như vậy.”

Bill Gates

Microsoft

Trong bài hướng dẫn tự học Lập trình PHP này, bạn sẽ dược học cách mã hóa (endcode)giải mã (decode) dữ liệu JSON với PHP.

Vậy,

JSON là gì?

JSON là từ viết tắt của Javascript Object Notation. JSON là một định dạng tiêu chuẩn trong trao đổi dữ liệu nhẹ, nhanh chóng và dễ dàng tạo (generate) và phân tích (parse).

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ả con người và máy tính.

Nhưng không giống như XML, các 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.

Dữ liệu kiểu JSON dựa trên hai cấu trúc cơ bản:

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

Trong JSON, các key luôn là các string, trong khi giá trị có thể là một string, number, true hoặc false, null, thậm chí là một Object hoặc một Array.

Các string 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 như thế này:

Ví dụ về JSON Object theo cấu trúc Object

{
    "book": {
        "Tên": "Lập trình viên PHP",
        "Chữ ký": "PHP Dev",
        "Năm": 2019,
        "Loại": "Công nghệ",
        "Nổi tiếng": true
    }
}

Ví dụ về JSON Object theo cấu trúc Array

{
    "Danh mục": [
        "PHP Cơ Bản",
        "PHP Nâng Cao",
        "PHP & MySQL",
        "Ví dụ thực tế"
    ]
}

Ghi chú:

Định dạng data-interchange là định dạng văn bản được sử dụng để trao đổi hoặc hoán đổ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.

Hướng dẫn phân giải dữ liệu JSON với PHP
Hướng dẫn phân giải dữ liệu JSON với PHP

Phân giải JSON với PHP (JSON Parsing)

Cấu trúc dữ liệu JSON rất giống với mảng của PHP. PHP có các hàm dựng sẵn để encode và decode dữ liệu JSON.

Các hàm này lần lượt là json_encode()json_decode(). Cả hai chức năng chỉ hoạt động với dữ liệu chuỗi được mã hóa theo chuẩn UTF-8.

Endcoding dữ liệu JSON bằng PHP

Trong PHP, chúng ta sử dụng hàm json_encode() được sử dụng để mã hóa một giá trị thành định dạng JSON.

Giá trị được mã hóa có thể là bất kỳ loại dữ liệu PHP nào ngoại trừ tài nguyên như cơ sở dữ liệu hoặc liên quan đến xử lý tệp.

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:

<?php
// Một mảng kết hợp
$tuoiNhanVien = array("Khánh"=>27, "Đức"=>32, "Huyền"=>35, "Thúy"=>30);
 
echo json_encode($tuoiNhanVien);
?>

Kết quả nhận được như sau:

{"Khánh":27,"Đức":32,"Huyền":35,"Thúy":30}

Tương tự…

Bạn có thể mã hóa mảng chỉ số trong PHP thành một mảng JSON, như thế này:

<?php
// Mảng chỉ số
$mauSac= array("Đỏ", "Xanh", "Vàng", "Lục", "Lam");
 
echo json_encode($colors);
?>

Kết quả nhận được là:

["Đỏ","Xanh","Vàng","Lục","Lam"]

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

<?php
// Mảng chỉ số
// Mảng chỉ số
$mauSac= array("Đỏ", "Xanh", "Vàng", "Lục", "Lam");
 
echo json_encode($colors, JSON_FORCE_OBJECT);
?>

Kết quả nhận được là:

{"Đỏ","Xanh","Vàng","Lục","Lam"}

Như bạn có thể thấy trong các ví dụ trên, một mảng không kết hợp có thể được mã hóa thành 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.

Decoding dữ liệu JSON bằng PHP

Decoding dữ liệu JSON đơn giản như Endcoding nó. Bạn có thể sử dụng hàm json_decode() của PHP để chuyển đổi chuỗi được mã hóa JSON thành kiểu dữ liệu PHP phù hợp.

Ví dụ sau minh họa cách decoding hoặc chuyển đổi một đối tượng JSON thành đối tượng trong PHP.

<?php
// Lưu dữ liệu JSON trong biến
$json = '{"Khánh":27,"Đức":32,"Huyền":35,"Thúy":30}';
 
var_dump(json_decode($json));
?>

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

object(stdClass)#1 (4) { ["Khánh"]=> int(27) ["Đức"]=> int(32) ["Huyền"]=> int(35) ["Thúy"]=> int(30) }

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 thiết lập là true => các đối tượng JSON thực được decoding thành các mảng kết hợp.
  • Còn mặc định là false

Đây là ví dụ:

<?php
// Lưu dữ liệu JSON trong biến
$json = '{"Khánh":27,"Đức":32,"Huyền":35,"Thúy":30}';
 
var_dump(json_decode($json, true));
?>

Kết quả nhận được:

array(4) { ["Khánh"]=> int(27) ["Đức"]=> int(32) ["Huyền"]=> int(35) ["Thúy"]=> int(30) }

Tiếp theo, hãy xem một ví dụ sẽ chỉ cho bạn cách decoding JSON data và cách truy cập các phần tử riêng lẻ của đối tượng JSON hoặc mảng trong PHP.

<?php
// Gán chuỗi được mã hóa JSON cho một biến PHP
$json = '{"Khánh":27,"Đức":32,"Huyền":35,"Thúy":30}';
 
// Decode JSON data thành mảng kết hợp trong PHP
$arr = json_decode($json, true);
// Truy cập giá trị của mảng kết hợp
echo $arr["Khánh"];  // Output: 27
echo $arr["Đức"];  // Output: 32
echo $arr["Huyền"];   // Output: 35
echo $arr["Thúy"];  // Output: 30
 
// Decode JSON data thành đối tượng trong PHP
$obj = json_decode($json);
// Truy cập dữ liệu từ đối tượng được trả về
echo $obj->Khánh;   // Output: 65
echo $obj->Đức;   // Output: 80
echo $obj->Huyền;    // Output: 78
echo $obj->Thúy;   // Output: 90
?>

Bạn cũng có thể lặp qua dữ liệu được decoding bằng vòng lặp foreach(), như thế này:

<?php
// Gán chuỗi được mã hóa JSON cho một biến PHP
$json = '{"Khánh":27,"Đức":32,"Huyền":35,"Thúy":30}';
 
// Decode JSON data thành mảng kết hợp trong PHP
$arr = json_decode($json, true);
 
// Lặp qua mảng Kết hợp
foreach($arr as $key=>$value){
    echo $key . "=>" . $value . "<br>";
}
echo "<hr>";
// Decode JSON data thành đối tượng trong PHP
$obj = json_decode($json);
 
// Lặp qua đối tượng
foreach($obj as $key=>$value){
    echo $key . "=>" . $value . "<br>";
}
?>

Hướng dẫn trích xuất các giá trị từ dữ liệu JSON lồng nhau trong PHP

Trong khi làm việc với JSON, các đối tượng và mảng JSON cũng có thể được lồng nhau. Một đối tượng JSON có thể tùy ý chứa các đối tượng JSON, 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 .

<?php
// Khai báo hàm đệ quy để trích xuất các giá trị lồng nhau
function printValues($arr) {
    global $count;
    global $values;
    
    // Kiểm tra đầu vào của một mảng
    if(!is_array($arr)){
        die("ERROR: Đầu vào không phải một mảng");
    }
    
    /*
    *Lặp qua một mảng
    *Nếu giá trị tự nó là một mảng thì gọi hàm đệ quy
    *Nếu không thì thêm giá trị tìm thấy vào mảng đầu ra
    *Tăng bộ đếm lên 1 đơn vị
    */
    foreach($arr as $key=>$value){
        if(is_array($value)){
            printValues($value);
        } else{
            $values[] = $value;
            $count++;
        }
    }
    
    // Trả về tổng số giá trị được tìm thấy trong Mảng
    return array('total' => $count, 'values' => $values);
}
 
// Gán chuỗi JSON được mã hóa cho một biến PHP
$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 Dữ liệu JSON thành định dạng mảng kết hợp
$arr = json_decode($json, true);
 
// Gọi hàm và in tất cả các giá trị
$result = printValues($arr);
echo "<h3>" . $result["total"] . " value(s) found: </h3>";
echo implode("<br>", $result["values"]);
 
echo "<hr>";
 
// In giá trị riêng lẻ
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
?>

Tổng kết

Như vậy là qua bài này bạn đã được học về cách endcode decode dữ liệu JSON trong PHP.

Đây là một dạng dữ liệu trao đổi giữa các nền tảng rất phổ biến. Hãy thực hành lại các ví dụ để chắc chắn bạn đã hiểu và nắm được các thao tác với dữ liệu JSON bằng PHP.

PHPDev

Có thể bạn muốn xem

Pesudo class trong CSS

Bộ chọn lớp giả CSS (Pesudo class Selector) khớp với các thành phần dựa trên một điều kiện bổ sung và không nhất thiết phải được định nghĩa trong DOM tree.

Pesudo Element trong CSS

Sử dụng phần tử giả (Pesudo element) trong CSS là một cách để áp dụng các quy tắc CSS cho phần tử không xác định vị trí trong DOM tree.

Leave a reply

Please enter your comment!
Please enter your name here