json_decode để mảng


422

Tôi đang cố gắng giải mã một chuỗi JSON thành một mảng nhưng tôi gặp lỗi sau.

Lỗi nghiêm trọng: Không thể sử dụng đối tượng của kiểu stdClass làm mảng trong C: \ wamp \ www \ temp \ asklaila.php trên dòng 6

Đây là mã:

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj['Result']);
?>

1
Nó sẽ làm việc nếu bạn truy cập $ob->Resultthay thế.
lapin

Câu trả lời:


839

Theo tài liệu , bạn cần chỉ định nếu bạn muốn một mảng kết hợp thay vì một đối tượng từ đó json_decode, đây sẽ là mã:

json_decode($jsondata, true);

4
Nó đặt ra câu hỏi, những lợi thế của việc nó trở lại như một mảng và không phải là một đối tượng là gì?
Foxinni

52
Nó đặt ra câu hỏi. Để "cầu xin một câu hỏi" có nghĩa là giả định một cái gì đó vẫn còn phải được chứng minh ( ref ). Trong cả hai trường hợp, lợi thế có thể là OP thoải mái di chuyển qua các mảng hơn các đối tượng hoặc một số mã khác đã được triển khai, yêu cầu một mảng.
jamesnotjim

8
@jamesnotjim Việc triển khai mặc định trả về một đối tượng có thể đặt ra câu hỏi rằng các đối tượng là giá trị trả về tốt hơn mảng, có thể không?
David Mann

7
Quả thực nó có thể @DavidMann. Cảm động!
jamesnotjim

8
Tôi sẽ thêm nhận xét (mặc dù nhiều năm sau) rằng không có khả năng JSON chứa bất cứ thứ gì ngoài dữ liệu làm cho lựa chọn "mặc định" khó hiểu này.
Barry

45

thử cái này

$json_string = 'http://www.domain.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata,true);
echo "<pre>";
print_r($obj);

27

Đây là một đóng góp muộn, nhưng có một trường hợp hợp lệ để đúc json_decodevới (array).
Hãy xem xét những điều sau đây:

$jsondata = '';
$arr = json_decode($jsondata, true);
foreach ($arr as $k=>$v){
    echo $v; // etc.
}

Nếu $jsondatađược trả về dưới dạng một chuỗi rỗng (như theo kinh nghiệm của tôi thì nó thường như vậy),json_decode sẽ trả về NULL, dẫn đến lỗi Cảnh báo: Đối số không hợp lệ được cung cấp cho foreach () trên dòng 3 . Bạn có thể thêm một dòng mã if / then hoặc toán tử ternary, nhưng IMO sẽ sạch hơn khi chỉ cần thay đổi dòng 2 thành ...

$arr = (array) json_decode($jsondata,true);

... trừ khi bạn đang xử json_decodelý hàng triệu mảng lớn cùng một lúc, trong trường hợp như @ TCB13 chỉ ra, hiệu suất có thể bị ảnh hưởng tiêu cực.



6

Theo hàm Tài liệu PHP json_decode có một tham số có tên là PGS để chuyển đổi các đối tượng được trả về thành các mảng kết hợp

 mixed json_decode ( string $json [, bool $assoc = FALSE ] )

Vì tham số assocFALSE theo mặc định, Bạn phải đặt giá trị này TRUEđể truy xuất một mảng.

Kiểm tra mã dưới đây để biết hàm ý ví dụ:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));

đầu ra nào:

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)
}

5

Điều này cũng sẽ thay đổi nó thành một mảng:

<?php
    print_r((array) json_decode($object));
?>

6
Điều này gây lãng phí CPU / Bộ nhớ, như được đề xuất json_decode($object, true);truehoàn toàn giống nhau, bên trong nhanh hơn nhiều.
TCB13

1
@ TCB13 ngoại trừ nếu bạn cần cả hai và không muốn chạy lại giải mã
Jimmy Kane

3
Đồng tình với @JimmyKane. Tôi đã thử và chạy cả hai phiên bản trong một chu kỳ; nếu bạn cần cả đối tượng và mảng (mặc dù điều này hiếm khi xảy ra?), json_decode+ truyền nhanh hơn 45% so với chạy cả hai hương vị của json_decode. Mặt khác, cả hai đều nhanh đến mức trừ khi bạn cần hàng ngàn giải mã theo nghĩa đen , sự khác biệt là không đáng kể.
LSerni

4

json_decodehỗ trợ đối số thứ hai, khi nó được đặt thành TRUEnó sẽ trả về một Arraythay vì stdClass Object. Kiểm tra trang Hướng dẫnjson_decode chức năng để xem tất cả các đối số được hỗ trợ và chi tiết của nó.

Ví dụ thử cái này:

$json_string = 'http://www.example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, TRUE); // Set second argument as TRUE
print_r($obj['Result']); // Now this will works!

3
json_decode($data, true); // Returns data in array format 

json_decode($data); // Returns collections 

Vì vậy, nếu muốn một mảng hơn bạn có thể chuyển đối số thứ hai là 'true' trong json_decodehàm.


3

Tôi hy vọng điều này sẽ giúp bạn

$json_ps = '{"courseList":[  
            {"course":"1", "course_data1":"Computer Systems(Networks)"},  
            {"course":"2", "course_data2":"Audio and Music Technology"},  
            {"course":"3", "course_data3":"MBA Digital Marketing"}  
        ]}';

Sử dụng chức năng giải mã Json

$json_pss = json_decode($json_ps, true);

Vòng lặp trên mảng JSON trong php

foreach($json_pss['courseList'] as $pss_json)
{

    echo '<br>' .$course_data1 = $pss_json['course_data1']; exit; 

}

Kết quả : Hệ thống máy tính (Mạng)


2

trong PHP json_decode chuyển đổi dữ liệu json thành mảng liên quan đến PHP
Đối với Ex:$php-array= json_decode($json-data, true); print_r($php-array);


2

Hãy thử nó

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, true);
echo "<pre>"; print_r($obj['Result']);
?>

2

Hãy thử như thế này:

$json_string = 'https://example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj->Result);
foreach($obj->Result as $value){
  echo $value->id; //change accordingly
}
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.