Intro
ก่อนอื่นคุณมีสตริง JSON ไม่ใช่อาร์เรย์วัตถุหรือโครงสร้างข้อมูล JSONเป็นรูปแบบอนุกรมข้อความตาม - เพื่อสตริงแฟนซี แต่ยังคงเป็นเพียงสตริง ถอดรหัสได้ใน PHP json_decode()โดยใช้
 $data = json_decode($json);
ในนั้นคุณอาจพบ:
นี่คือสิ่งที่สามารถเข้ารหัสใน JSON หรืออย่างแม่นยำมากกว่านี้คือเวอร์ชันของ PHP ที่สามารถเข้ารหัสใน JSON
ไม่มีอะไรพิเศษเกี่ยวกับพวกเขา พวกเขาไม่ใช่ "วัตถุ JSON" หรือ "อาร์เรย์ JSON" คุณได้ถอดรหัส JSON - ตอนนี้คุณมีพื้นฐานในชีวิตประจำวันประเภท PHP
วัตถุจะเป็นอินสแตนซ์ของstdClassซึ่งเป็นคลาสในตัวซึ่งเป็นสิ่งทั่วไปที่ไม่สำคัญ
การเข้าถึงคุณสมบัติวัตถุ
คุณเข้าถึงคุณสมบัติของหนึ่งในเหล่านี้วัตถุแบบเดียวกับที่คุณต้องการสำหรับคุณสมบัติที่ไม่คงที่สาธารณะของวัตถุอื่น ๆ $object->propertyเช่น
$json = '
{
    "type": "donut",
    "name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type; //donut
การเข้าถึงองค์ประกอบอาร์เรย์
คุณสามารถเข้าถึงองค์ประกอบหนึ่งของอาร์เรย์เหล่านี้วิธีเดียวกับที่คุณต้องการสำหรับอาร์เรย์อื่น ๆ $array[0]เช่น
$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
foreachย้ำกว่าด้วย
foreach ($toppings as $topping) {
    echo $topping, "\n";
}
  
  ช็อกโกแลตเคลือบด้วย
  เมเปิ้ลโรย
หรือระเบียบเกี่ยวกับใด ๆ ของbazillion ในตัวฟังก์ชั่นอาร์เรย์
การเข้าถึงรายการที่ซ้อนกัน
คุณสมบัติของวัตถุและองค์ประกอบของอาร์เรย์อาจจะมีวัตถุเพิ่มเติมและ / หรืออาร์เรย์ - $object->array[0]->etcคุณก็ยังคงสามารถเข้าถึงคุณสมบัติและสมาชิกตามปกติเช่นของพวกเขา
$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';
$yummy = json_decode($json);
echo $yummy->toppings[2]->id; //5004
ผ่านtrueเป็นอาร์กิวเมนต์ที่สองเพื่อjson_decode ()
เมื่อคุณทำเช่นนี้แทนที่จะเป็นวัตถุคุณจะได้รับอาร์เรย์ที่เชื่อมโยงกันคืออาร์เรย์ที่มีสตริงสำหรับคีย์ $array['key']อีกครั้งคุณเข้าถึงองค์ประกอบดังกล่าวได้ตามปกติเช่น
$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';
$yummy = json_decode($json, true);
echo $yummy['toppings'][2]['type']; //Maple
การเข้าถึงรายการอาเรย์แบบเชื่อมโยง
เมื่อถอดรหัสวัตถุ JSON ไปยังอาร์เรย์ PHP ที่เชื่อมโยงคุณสามารถทำซ้ำทั้งคีย์และค่าโดยใช้foreach (array_expression as $key => $value)ไวยากรณ์เช่น
$json = '
{
    "foo": "foo value",
    "bar": "bar value",
    "baz": "baz value"
}';
$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
    echo "The value of key '$key' is '$value'", PHP_EOL;
}
พิมพ์
  ค่าของคีย์ 'foo' คือ 'foo value' 
  ค่าของคีย์ 'bar' คือ 'bar value' 
  ค่าของคีย์ 'baz' คือ 'baz value'
ไม่ทราบว่าโครงสร้างข้อมูลเป็นอย่างไร
อ่านเอกสารสำหรับสิ่งที่คุณจะได้รับจาก JSON
ดู JSON ที่คุณเห็นวงเล็บปีกกา{}คาดหวังวัตถุที่คุณเห็นวงเล็บเหลี่ยม[]คาดหวังอาร์เรย์
เข้าถึงข้อมูลที่ถอดรหัสด้วยprint_r():
$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';
$yummy = json_decode($json);
print_r($yummy);
และตรวจสอบผลลัพธ์:
stdClass Object
(
    [type] => donut
    [name] => Cake
    [toppings] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 5002
                    [type] => Glazed
                )
            [1] => stdClass Object
                (
                    [id] => 5006
                    [type] => Chocolate with Sprinkles
                )
            [2] => stdClass Object
                (
                    [id] => 5004
                    [type] => Maple
                )
        )
)
มันจะบอกคุณว่าคุณมีวัตถุอยู่ที่ไหนที่คุณมีอาร์เรย์พร้อมกับชื่อและค่านิยมของสมาชิก
หากคุณสามารถได้รับเพื่อให้ห่างไกลเป็นมันก่อนที่คุณจะได้รับหายไป - ไปที่ไกลและตีว่าด้วยprint_r():
print_r($yummy->toppings[0]);
stdClass Object
(
    [id] => 5002
    [type] => Glazed
)
ลองดูที่มันอยู่ในนี้สำรวจ JSON ที่มีประโยชน์แบบโต้ตอบ
แบ่งปัญหาออกเป็นชิ้นส่วนที่ง่ายต่อการห่อหัวของคุณ
json_decode() ผลตอบแทน null
สิ่งนี้เกิดขึ้นเพราะ:
- JSON nullประกอบด้วยทั้งหมดของเพียงแค่นั้น
- JSON ไม่ถูกต้อง - ตรวจสอบผลของjson_last_error_msgหรือใส่มันผ่านสิ่งที่ต้องการJSONLint
- มันมีองค์ประกอบซ้อนกันมากกว่า 512 ระดับลึก json_decode()นี้ความลึกสูงสุดเริ่มต้นสามารถแทนที่โดยผ่านจำนวนเต็มเป็นอาร์กิวเมนต์ที่สามไป
หากคุณต้องการเปลี่ยนความลึกสูงสุดคุณอาจแก้ไขปัญหาที่ไม่ถูกต้อง ค้นหาสาเหตุที่คุณได้รับข้อมูลที่ซ้อนกันอย่างลึกซึ้ง (เช่นบริการที่คุณกำลังสืบค้นที่สร้าง JSON มีข้อบกพร่อง) และทำให้สิ่งนั้นไม่เกิดขึ้น
ชื่อคุณสมบัติวัตถุมีอักขระพิเศษ
บางครั้งคุณจะมีชื่อคุณสมบัติวัตถุที่มีบางอย่างเช่นยัติภังค์-หรือเครื่องหมาย@ที่ไม่สามารถใช้ในตัวระบุที่แท้จริง แต่คุณสามารถใช้สตริงตัวอักษรในวงเล็บปีกกาเพื่อแก้ไข
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
หากคุณมีจำนวนเต็มเป็นคุณสมบัติดู: วิธีเข้าถึงคุณสมบัติวัตถุที่มีชื่อเช่นจำนวนเต็ม เป็นข้อมูลอ้างอิง
มีคนใส่ JSON ใน JSON ของคุณ
มันไร้สาระ แต่มันเกิดขึ้น - มีการเข้ารหัส JSON เป็นสตริงภายใน JSON ของคุณ ถอดรหัสเข้าถึงสตริงตามปกติถอดรหัสนั้นและในที่สุดก็จะได้สิ่งที่คุณต้องการ
$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';
$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);
echo $toppings[0]->type; //Glazed
ข้อมูลไม่พอดีกับหน่วยความจำ
หาก JSON ของคุณมีขนาดใหญ่เกินกว่าที่json_decode()จะรับมือได้ในครั้งเดียวสิ่งต่าง ๆ เริ่มที่จะยุ่งยาก ดู:
วิธีการจัดเรียง
โปรดดูที่: อ้างอิง: วิธีพื้นฐานทั้งหมดจะเรียงลำดับอาร์เรย์และข้อมูลใน PHP