json_encode / json_decode - ส่งคืน stdClass แทน Array ใน PHP


108

สังเกตสคริปต์เล็ก ๆ นี้:

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

เหตุใด PHP จึงเปลี่ยน JSON Object ให้เป็นคลาส

ไม่ควรอาร์เรย์ที่เป็นjson_encodedแล้วjson_decodedผลผลิตผลเดียวกันแน่นอน?

คำตอบ:


146

ดูพารามิเตอร์ที่สองอย่างละเอียดยิ่งขึ้นjson_decode($json, $assoc, $depth)ที่https://secure.php.net/json_decode


7
ไม่ตอบคำถาม - ทำไม stdClass จึงเป็นค่าเริ่มต้น ดูstackoverflow.com/questions/3193765/…
William Entriken

7
นี่ไม่ได้ตอบคำถามจริงๆมันเป็นเพียงวิธีแก้ปัญหาเท่านั้น แต่วิธีแก้ปัญหาหมัด IMO จะเกิดอะไรขึ้นถ้าคุณต้องการให้วัตถุที่เข้ารหัส json ถูกถอดรหัสเป็นวัตถุและอาร์เรย์ที่เชื่อมโยงที่ถอดรหัสด้วย json เพื่อให้ถอดรหัสเป็นอาร์เรย์ที่เชื่อมโยงโดยอัตโนมัติ การใช้พารามิเตอร์ที่สองเพื่อ json_decode () หมายถึงการแทรกแซงบางอย่างของมนุษย์ ตรงไปตรงมานี่เป็นเรื่องที่น่ารังเกียจ (ของ PHP ไม่ใช่คำตอบนี้)
JDS

@JDS คุณสามารถรวมฟังก์ชั่นเหล่านั้นได้อย่างง่ายดายและสร้างของคุณเองซึ่งเก็บประเภทซอร์สไว้ในคีย์ json อย่างโปร่งใสหากคุณต้องการ
sivann

2
@JDS ฉันได้เพิ่มคำตอบที่ตอบคำถามที่ว่า "เหตุใด PHP จึงเปลี่ยน JSON Object ให้เป็นคลาส"
7ochem

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

ให้คุณมีอาร์เรย์


2
นี่เป็นประโยชน์อย่างยิ่งขอบคุณ @Kai Chain - ฉันคิดว่าคำถามเดิมคือถามว่า "ทำไม" แต่ดูเหมือนจะได้สิ่งที่พวกเขาตั้งใจไว้ ไม่ว่าในกรณีใดเหมาะสำหรับสถานการณ์ของฉัน
ghukill

และทำงานเดียวกันหลังจาก 4 ปีที่นี่! ความรู้พื้นฐานที่ทุกคนควรศึกษาก่อนอย่างฉัน!
KJS

21

เพื่อตอบคำถามจริง:

เหตุใด PHP จึงเปลี่ยน JSON Object ให้เป็นคลาส

ดูผลลัพธ์ของ JSON ที่เข้ารหัสให้ละเอียดยิ่งขึ้นฉันได้ขยายตัวอย่างที่ OP ให้ข้อมูลเล็กน้อย:

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

รูปแบบ JSON ได้มาจากมาตรฐานเดียวกันกับ JavaScript ( ECMAScript Programming Language Standard ) และหากคุณดูรูปแบบดูเหมือน JavaScript เป็นออบเจ็กต์ JSON ( {}= ออบเจ็กต์ ) ที่มีคุณสมบัติ "stuff" พร้อมค่า "สิ่งต่างๆ" และมีคุณสมบัติ "things" โดยค่าของมันเป็นอาร์เรย์ของสตริง ( []= array )

JSON (เป็น JavaScript) ไม่ทราบว่าเชื่อมโยงอาร์เรย์เฉพาะอาร์เรย์ที่จัดทำดัชนีเท่านั้น ดังนั้นเมื่อ JSON เข้ารหัสอาร์เรย์ PHP เชื่อมโยงสิ่งนี้จะส่งผลให้สตริง JSON ที่มีอาร์เรย์นี้เป็น "ออบเจ็กต์"

ตอนนี้เรากำลังถอดรหัส JSON json_decode($arrayEncoded)อีกครั้งโดยใช้ ฟังก์ชันถอดรหัสไม่ทราบว่าสตริง JSON นี้มาจากที่ใด (อาร์เรย์ PHP) จึงถอดรหัสเป็นวัตถุที่ไม่รู้จักซึ่งอยู่stdClassใน PHP ดังที่คุณจะเห็นอาร์เรย์ของสตริง "things" จะถอดรหัสเป็นอาร์เรย์ PHP ที่จัดทำดัชนี

ดูเพิ่มเติมที่:


ขอบคุณhttps://www.randomlists.com/thingsสำหรับ 'สิ่งต่างๆ'


2
นี่คือคำตอบที่ถูกต้อง ... มันตอบคำถามในขณะที่คำตอบอื่น ๆ ให้วิธีแก้ปัญหาสำหรับปัญหาที่ไม่สามารถอธิบายได้ ขอบคุณฉันกำลังไปในแวดวงโดยลืมไปว่า JSON ไม่รองรับการเชื่อมโยงอาร์เรย์!
marcus

5

แม้ว่าตามที่กล่าวไว้คุณสามารถเพิ่มพารามิเตอร์ที่สองที่นี่เพื่อระบุว่าคุณต้องการให้อาร์เรย์ส่งคืน:

$array = json_decode($json, true);

หลายคนอาจชอบที่จะส่งผลลัพธ์แทน:

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

การอ่านอาจจะชัดเจนกว่านี้


4
มีความแตกต่างกัน โปรดทราบว่าคุณได้เข้ารหัสอาร์เรย์หรือวัตถุหลายมิติ อันแรกให้อาร์เรย์อาร์เรย์แก่คุณอันที่สองให้อาร์เรย์ของอ็อบเจ็กต์
เฮคเตอร์

2

tl; dr: JavaScript ไม่รองรับการเชื่อมโยงอาร์เรย์ดังนั้น JSON ก็ไม่รองรับ

ท้ายที่สุดมันคือ JSON ไม่ใช่ JSAAN :)

ดังนั้น PHP จึงต้องแปลงอาร์เรย์ของคุณให้เป็นวัตถุเพื่อเข้ารหัสเป็น 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]

หากคุณถอดรหัส json เป็นอาร์เรย์ข้อมูลจะสูญหายไปในสถานการณ์นี้


0

นอกจากนี้ยังมีดี PHP 4 JSON เข้ารหัส / ถอดรหัสห้องสมุด (นั่นคือแม้ PHP 5 ย้อนกลับเข้ากันได้) เขียนเกี่ยวกับการโพสต์ในบล็อกนี้: การใช้ json_encode () และ json_decode () ใน PHP4 (มิถุนายน 2009)

รหัสคอนกรีตคือ Michal Migurski และ Matt Knapp:

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