json_encode / json_decode - trả về stdClass thay vì Array trong PHP


108

Hãy quan sát tập lệnh nhỏ này:

$array = array('stuff' => 'things');
print_r($array);
//prints - Array ( [stuff] => things )
$arrayEncoded = json_encode($array);
echo $arrayEncoded . "<br />";
//prints - {"stuff":"things"}
$arrayDecoded = json_decode($arrayEncoded);
print_r($arrayDecoded);
//prints - stdClass Object ( [stuff] => things )

Tại sao PHP biến Đối tượng JSON thành một lớp?

Một mảng json_encodedsau đó có nên json_decodedmang lại kết quả CHÍNH XÁC không?

Câu trả lời:


145

Hãy xem kỹ tham số thứ hai của json_decode($json, $assoc, $depth)tại https://secure.php.net/json_decode


7
Không trả lời câu hỏi - tại sao stdClass là mặc định. Xem thêm stackoverflow.com/questions/3193765/…
William Entriken

7
Điều này thực sự không trả lời câu hỏi, nó chỉ cung cấp một cách giải quyết. Nhưng một cách giải quyết tệ hại, IMO. Điều gì sẽ xảy ra nếu bạn muốn các đối tượng được mã hóa json được giải mã dưới dạng các đối tượng và các mảng kết hợp được giải mã json được giải mã dưới dạng mảng kết hợp một cách tự động? Sử dụng tham số thứ hai cho json_decode () ngụ ý một số loại can thiệp của con người. Thành thật mà nói, điều này thật tệ (của PHP, không phải của câu trả lời này)
JDS

@JDS bạn có thể rất dễ dàng gói các chức năng đó và tạo của riêng bạn để lưu trữ loại nguồn trong khóa json một cách minh bạch nếu bạn cần.
sivann

2
@JDS Tôi đã thêm một câu trả lời thực sự trả lời câu hỏi "Tại sao PHP lại biến Đối tượng JSON thành một lớp?"
7 giờ 10

82
$arrayDecoded = json_decode($arrayEncoded, true);

cung cấp cho bạn một mảng.


2
Điều này thật hữu ích, cảm ơn bạn @Kai Chain - Tôi cho rằng câu hỏi ban đầu là "Tại sao", nhưng điều này dường như không đạt được những gì họ dự định. Dù thế nào đi nữa, hoàn hảo cho hoàn cảnh của tôi.
ghukill

Và làm công việc tương tự sau 4 năm ở đây! Kiến thức cơ bản mà thực tế ai cũng nên học trước, như tôi!
KJS

20

Để trả lời câu hỏi thực tế:

Tại sao PHP biến Đối tượng JSON thành một lớp?

Hãy xem xét kỹ hơn đầu ra của JSON được mã hóa, tôi đã mở rộng ví dụ mà OP đưa ra một chút:

$array = array(
    'stuff' => 'things',
    'things' => array(
        'controller', 'playing card', 'newspaper', 'sand paper', 'monitor', 'tree'
    )
);
$arrayEncoded = json_encode($array);
echo $arrayEncoded;
//prints - {"stuff":"things","things":["controller","playing card","newspaper","sand paper","monitor","tree"]}

Định dạng JSON được bắt nguồn từ cùng một tiêu chuẩn với JavaScript ( Tiêu chuẩn ngôn ngữ lập trình ECMAScript ) và nếu bạn nhìn vào định dạng thì nó giống như JavaScript. Nó là một đối tượng JSON ( {}= object ) có thuộc tính "thứ" với giá trị "things" và có thuộc tính "things" với giá trị của nó là một mảng chuỗi ( []= mảng ).

JSON (như JavaScript) không biết mảng kết hợp chỉ các mảng được lập chỉ mục. Vì vậy, khi JSON mã hóa một mảng kết hợp PHP, điều này sẽ dẫn đến một chuỗi JSON chứa mảng này như một "đối tượng".

Bây giờ chúng tôi đang giải mã lại JSON bằng cách sử dụng json_decode($arrayEncoded). Hàm giải mã không biết chuỗi JSON này bắt nguồn từ đâu (một mảng PHP) nên nó đang giải mã thành một đối tượng không xác định, nằm stdClasstrong PHP. Như bạn sẽ thấy, mảng chuỗi "thứ" SẼ giải mã thành một mảng PHP được lập chỉ mục.

Cũng thấy:


Cảm ơn https://www.randomlists.com/things về 'những điều'


2
đây là câu trả lời chính xác ... nó trả lời câu hỏi, trong khi những câu khác đưa ra cách giải quyết cho một vấn đề không giải thích được. Cảm ơn, tôi đã tham gia vòng kết nối mà quên rằng JSON không hỗ trợ mảng liên kết!
marcus

5

Mặc dù, như đã đề cập, bạn có thể thêm tham số thứ hai ở đây để cho biết bạn muốn một mảng được trả về:

$array = json_decode($json, true);

Nhiều người có thể thích truyền kết quả thay thế:

$array = (array)json_decode($json);

Nó có thể rõ ràng hơn để đọc.


4
Có khác nhau. Hãy lưu ý nếu bạn đã mã hóa một mảng hoặc đối tượng đa chiều. Cái đầu tiên cung cấp cho bạn mảng mảng, cái thứ hai cung cấp cho bạn mảng đối tượng.
Hector

2

tl; dr: JavaScript không hỗ trợ mảng kết hợp, do đó JSON cũng vậy.

Rốt cuộc, đó là JSON, không phải JSAAN. :)

Vì vậy, PHP phải chuyển đổi mảng của bạn thành một đối tượng để mã hóa thành JSON.


1
    var_dump(json_decode('{"0":0}'));    // output: object(0=>0)
    var_dump(json_decode('[0]'));          //output: [0]

    var_dump(json_decode('{"0":0}', true));//output: [0]
    var_dump(json_decode('[0]', true));    //output: [0]

Nếu bạn giải mã json thành mảng, thông tin sẽ bị mất trong tình huống này.


0

Ngoài ra còn có một thư viện mã hóa / giải mã PHP 4 json tốt (thậm chí tương thích ngược với PHP 5) được viết trong bài đăng trên blog này: Sử dụng json_encode () và json_decode () trong PHP4 (tháng 6 năm 2009) .

Mã cụ thể là của Michal Migurski và của Matt Knapp:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.