json_decode เป็นอาร์เรย์


422

ฉันพยายามที่จะถอดรหัสสตริง JSON เป็นอาร์เรย์ แต่ฉันได้รับข้อผิดพลาดดังต่อไปนี้

ข้อผิดพลาดร้ายแรง: ไม่สามารถใช้วัตถุประเภท stdClass เป็นอาร์เรย์ใน C: \ wamp \ www \ temp \ asklaila.php ในบรรทัด 6

นี่คือรหัส:

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

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

1
มันจะทำงานถ้าคุณเข้าถึงด้วย$ob->Resultแทน
ตัวผู้

คำตอบ:


839

ตามเอกสารคุณจำเป็นต้องระบุว่าคุณต้องการอาเรย์แบบเชื่อมโยงแทนที่จะเป็นออบเจ็กต์json_decodeหรือไม่นี่คือรหัส:

json_decode($jsondata, true);

4
มันเป็นคำถามคำถามอะไรคือข้อดีของการมีมันกลับมาเป็นอาร์เรย์และไม่ใช่วัตถุ?
Foxinni

52
มันทำให้เกิดคำถาม การ "ถามคำถาม" หมายถึงการสมมติสิ่งที่ยังคงได้รับการพิสูจน์ ( อ้างอิง ) ในทั้งสองกรณีข้อดีอาจเป็นได้ว่า OP นั้นเป็นอาเรย์การสำรวจเส้นทางที่สะดวกสบายกว่าอ็อบเจกต์หรือบางรหัสที่ใช้อยู่แล้วนั้นต้องใช้อาเรย์
jamesnotjim

8
@jamesnotjim การใช้งานเริ่มต้นที่ส่งคืนวัตถุอาจถามคำถามว่าวัตถุนั้นมีค่าตอบแทนที่ดีกว่าอาร์เรย์ใช่หรือไม่
David Mann

7
แน่นอนมันสามารถ @DavidMann Touch?!
jamesnotjim

8
ฉันจะเพิ่มความคิดเห็น (แม้ว่าปีต่อมา) ว่ามีความเป็นไปได้ของ JSON ที่มีอะไร แต่ข้อมูลทำให้ตัวเลือก "เริ่มต้น" สับสนนี้
Barry

45

ลองนี้

$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

นี่คือผลงานปลาย แต่มีกรณีที่ถูกต้องสำหรับการหล่อด้วยjson_decode พิจารณาสิ่งต่อไปนี้:(array)

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

ถ้า$jsondataเคยกลับมาเป็นสตริงที่ว่างเปล่า (ในขณะที่ประสบการณ์ของผมมันมักจะเป็น) json_decodeจะกลับมาNULLส่งผลให้เกิดข้อผิดพลาดคำเตือน: อาร์กิวเมนต์ไม่ถูกต้องจำหน่ายสำหรับ foreach () ในบรรทัดที่ 3 คุณสามารถเพิ่มบรรทัด if / then code หรือผู้ประกอบการที่ประกอบไปด้วยกัน แต่ IMO มันสะอาดกว่าที่จะเปลี่ยน line 2 เป็น ...

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

... หากคุณไม่ได้ใช้json_decodeอาร์เรย์ขนาดใหญ่หลายล้านรายการพร้อมกันซึ่งในกรณีที่ @ TCB13 ชี้ให้เห็นประสิทธิภาพอาจส่งผลกระทบในทางลบ



6

ตามฟังก์ชั่นเอกสาร PHP json_decodeมีพารามิเตอร์ชื่อassocซึ่งแปลงวัตถุที่ส่งคืนเป็นอาร์เรย์เชื่อมโยง

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

เนื่องจากพารามิเตอร์assocเป็นFALSEค่าเริ่มต้นคุณต้องตั้งค่านี้เป็นTRUEเพื่อเรียกคืนอาร์เรย์

ตรวจสอบโค้ดด้านล่างเพื่อดูตัวอย่าง:

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

ผลลัพธ์ใด:

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

สิ่งนี้จะเปลี่ยนเป็นอาร์เรย์:

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

6
นี่เป็นการสูญเสีย CPU / หน่วยความจำตามที่แนะนำjson_decode($object, true);ในtrueสิ่งที่เหมือนกันภายในได้เร็วขึ้นมาก
TCB13

1
@ TCB13 ยกเว้นถ้าคุณจำเป็นต้องใช้ทั้งและไม่ต้องการที่จะเรียกใช้ถอดรหัสอีกครั้ง
จิมมี่เทอรีเคน

3
เห็นด้วยกับ @JimmyKane ฉันลองและเรียกใช้ทั้งสองรุ่นในรอบ; หากคุณจำเป็นต้องใช้ทั้งวัตถุและอาเรย์ (แม้ว่านี้ควรจะเกิดขึ้นไม่ค่อย?) json_decode+ หล่อเป็น 45% json_decodeเร็วกว่าวิ่งรสชาติทั้งสอง ในทางกลับกันทั้งสองอย่างรวดเร็วดังนั้นหากคุณไม่ต้องการถอดรหัสนับพันอย่างแท้จริงความแตกต่างนั้นเล็กน้อย
LSerni

4

json_decodeสนับสนุนอาร์กิวเมนต์ที่สองเมื่อมันตั้งค่าให้TRUEมันจะกลับแทนArray stdClass Objectตรวจสอบหน้าคู่มือการใช้งานของjson_decodeฟังก์ชั่นเพื่อดูข้อโต้แย้งที่ได้รับการสนับสนุนและรายละเอียดทั้งหมด

ตัวอย่างเช่นลองสิ่งนี้:

$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 

ดังนั้นหากต้องการอาร์เรย์ที่มากกว่าคุณสามารถส่งผ่านอาร์กิวเมนต์ที่สองเป็น 'จริง' ในjson_decodeฟังก์ชั่น


3

ฉันหวังว่านี่จะช่วยคุณได้

$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"}  
        ]}';

ใช้ฟังก์ชั่นถอดรหัส Json

$json_pss = json_decode($json_ps, true);

วนรอบอาร์เรย์ JSON ใน php

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

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

}

ผลลัพธ์ : ระบบคอมพิวเตอร์ (เครือข่าย)


2

ใน PHP json_decode แปลงข้อมูล json เป็น array ที่เกี่ยวข้องของ PHP
สำหรับ Ex:$php-array= json_decode($json-data, true); print_r($php-array);


2

โปรดลองสิ่งนี้

<?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

ลองแบบนี้

$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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.