Hàm json_decode() trong PHP dùng để làm gì?

25/06/2020 - lượt xem
Chia sẻ
 
Rate this post

Hàm json_decode PHP dùng để giải mã 1 chuỗi JSON . Kết quả trả về của json_decode có thể là 1 mảng hoặc 1 đối tượng. Trái ngược với hàm json_decode là hàm json_encode – hàm để mã hóa thành chuỗi json.

Định Nghĩa.

Để nhận và giải mã chuỗi đã mã hóa JSON, người ta sử dụng hàm json_decode. Giải mã nói một cách đơn giản là khôi phục dữ liệu đã được mã hoá trở về bản gốc

Cú pháp.

Cú pháp:

json_decode ( string $json [, bool $assoc = FALSE [, int $depth = 512 [, int $options = 0 ]]] ) : mixed

Trong đó:

  • $json Chuỗi cần conver thành JSON.
    – Lưu ý : hàm này chỉ hoạt động với các chuỗi được mã hóa UTF-8.
  • $assoc Khi để là  TRUE, các đối tượng được trả về sẽ được chuyển đổi thành các mảng kết hợp.
  • $options: Set được việc sẽ convert theo định dạng như thế nào và có thể chỉ định được constant bằng cácoption. JSON_HEX_QUOTJSON_HEX_TAGJSON_HEX_AMPJSON_HEX_APOSJSON_NUMERIC_CHECKJSON_PRETTY_PRINTJSON_UNESCAPED_SLASHESJSON_FORCE_OBJECTJSON_PRESERVE_ZERO_FRACTIONJSON_UNESCAPED_UNICODEJSON_PARTIAL_OUTPUT_ON_ERROR

Giá trị trả về.

  • Trả về giá trị được mã hóa trong json theo kiểu PHP thích hợp. Các giá trị đúng, sai và null được trả về lần lượt là TRUE, FALSE và NULL. NULL được trả về nếu json không thể được giải mã hoặc nếu dữ liệu được mã hóa sâu hơn giới hạn đệ quy

Lưu ý: khi tham số return được sử dụng, hàm này sử dụng bên trong bộ đệm đầu ra, do đó không thể sử dụng nó trong hàm gọi lại ob_start ().

Sự thay đổi trên các phiên bản.

  • Trên phiên bản PHP 7.3.0 options JSON_THlaw_ON_ERROR đã được thêm vào.
  • 7.2.0 options JSON_INVALID_UTF8_IGNORE, and JSON_INVALID_UTF8_SUBSTITUTEđã được thêm vào.
  • 7.1.0 Khóa JSON trống (“”) có thể được mã hóa thành thuộc tính đối tượng trống thay vì sử dụng khóa có giá trị _empty_.
  • 7.0.0 Đã từ chối các định dạng số không tương thích RFC 7159 – cấp cao nhất (07, 0xff, .1, -.1) và tất cả các cấp ([1.], [1.e1]).
  • 7.0.0 Một chuỗi hoặc giá trị PHP trống mà sau khi truyền sang chuỗi là một chuỗi rỗng (NULL, FALSE) dẫn đến lỗi cú pháp JSON.
  • 5.6.0 Các biến thể không được phân cấp không hợp lệ của các chữ đúng, sai và null không còn được chấp nhận làm đầu vào hợp lệ và sẽ tạo ra các cảnh báo.
  • 5.4.0 options JSON_BIGINT_AS_STRINGJSON_OBJECT_AS_ARRAY được thêm vào.
  • 5.4.0 Các tham số tùy chọn đã được thêm vào.
  • 5.3.0 Đã thêm độ sâu tùy chọn. Độ sâu đệ quy mặc định được tăng từ 128 lên 512.
  • 5.2.3 giới hạnnesting được tăng từ 20 lên 128.
  • 5.2.1 Đã thêm hỗ trợ cho việc giải mã JSON của các loại cơ bản.

Ví dụ.

Ví dụ 1 dùng hàm json_decode() bình thương.

code:

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

?>

Kết quả:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

Ví dụ 2 khi chuyền một thuộc tính đối tượng không hợp lệ.

Mô tả:

Truy cập các phần tử trong một đối tượng có chứa các ký tự không được phép theo quy ước đặt tên của PHP (ví dụ: dấu gạch nối) có thể được thực hiện bằng cách đóng gói tên phần tử trong dấu ngoặc nhọn và dấu nháy đơn.

code:

?php

$json = '{"foo-bar": 12345}';

$obj = json_decode($json);
print $obj->{'foo-bar'}; // 12345

?>

Ví dụ 3 các lỗi phổ biến khi sử dụng json_decode

code:

<?php
// các chuỗi sau là JavaScript hợp lệ nhưng JSON không hợp lệ
// tên và giá trị phải được đặt trong dấu ngoặc kép
// dấu ngoặc đơn không hợp lệ
$bad_json = "{'bar': 'baz'}";
json_decode ($ bad_json); // vô giá trị
// tên phải được đặt trong dấu ngoặc kép
$bad_json = '{bar: "baz"}';
json_decode ($ bad_json); // vô giá trị
// dấu phẩy không được phép
$bad_json = '{bar: "baz",}';
json_decode ($bad_json); // vô giá trị
?>

Ví dụ  4 Lỗi độ sâu.

code:

$json = json_encode(
    array(
        1 => array(
            'English' => array(
                'One',
                'January'
            ),
            'French' => array(
                'Une',
                'Janvier'
            )
        )
    )
);

// Xác định các lỗi.
$constants = get_defined_constants(true);
$json_errors = array();
foreach ($constants["json"] as $name => $value) {
    if (!strncmp($name, "JSON_ERROR_", 11)) {
        $json_errors[$value] = $name;
    }
}

// Hiển thị các lỗi cho độ sâu khác nhau.
foreach (range(4, 3, -1) as $depth) {
    var_dump(json_decode($json, true, $depth));
    echo 'Last error: ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;
}
?>

Kết quả:

array(1) {
  [1]=>
  array(2) {
    ["English"]=>
    array(2) {
      [0]=>
      string(3) "One"
      [1]=>
      string(7) "January"
    }
    ["French"]=>
    array(2) {
      [0]=>
      string(3) "Une"
      [1]=>
      string(7) "Janvier"
    }
  }
}
Last error: JSON_ERROR_NONE

NULL
Last error: JSON_ERROR_DEPTH

Ví dụ 5 sử json_decode () với các số nguyên lớn.

code:

<?php
$json = '{"number": 12345678901234567890}';

var_dump(json_decode($json));
var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));

?>

Kết quả:

object(stdClass)#1 (1) {
  ["number"]=>
  float(1.2345678901235E+19)
}
object(stdClass)#1 (1) {
  ["number"]=>
  string(20) "12345678901234567890"
}

Chú ý.

  • JSON không phải là JavaScript, mà là một tập hợp con của JavaScript.
  • Trong trường hợp không giải mã được, json_last_error () có thể được sử dụng để xác định bản chất chính xác của lỗi.

Hàm liên quan.

Thông tin thêm.

  • Hãy chắc chắn rằng bạn chuyển nội dung utf8 hoặc json_decode có thể bị lỗi và chỉ trả về giá trị null. đối với những trường hớp nội dung không ở dạng UTF8 bạn có thể dùng như sau.

    <?php
    $contents = file_get_contents($url);
    $contents = utf8_encode($contents);
    $results = json_decode($contents);
    ?>
  • Đôi khi, tôi cần cho phép bình luận trong tập tin json. Vì vậy, tôi đã viết một func nhỏ để xóa các bình luận trong chuỗi json trước khi giải mã nó:

    <?php
    function json_clean_decode($json, $assoc = false, $depth = 512, $options = 0) {
        // search and remove comments like /* */ and //
        $json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);
       
        if(version_compare(phpversion(), '5.4.0', '>=')) {
            $json = json_decode($json, $assoc, $depth, $options);
        }
        elseif(version_compare(phpversion(), '5.3.0', '>=')) {
            $json = json_decode($json, $assoc, $depth);
        }
        else {
            $json = json_decode($json, $assoc);
        }
    
        return $json;
    }
    ?>

 

Các bạn có thể xem chi tiết hơn trên php.net.
Hi vọng với bài viết này, bạn đã hiểu rõ ứng dụng của hàm json_decode() trong PHP. Nếu bạn thấy bài viết hay và có ý nghĩa hãy like và chia sẻ bài viết này để mọi người cùng nhau học tập nhé.
Cảm ơn các bạn đã ghé thăm codetutam.com

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    Rate this post

    Xem thêm nhiều bài tin mới nhất về Kiến thức

    Xem thêm