ฉันจะดึงข้อมูลจาก JSON ด้วย PHP ได้อย่างไร

Mar 28 2015

นี่เป็นคำถามอ้างอิงทั่วไปและคำตอบที่ครอบคลุมคำถามที่ไม่มีวันจบสิ้น"ฉันจะเข้าถึงข้อมูลใน JSON ของฉันได้อย่างไร" คำถาม ที่นี่เพื่อจัดการพื้นฐานกว้าง ๆ ของการถอดรหัส JSON ใน PHP และเข้าถึงผลลัพธ์

ฉันมี JSON:

{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}

ฉันจะถอดรหัสสิ่งนี้ใน PHP และเข้าถึงข้อมูลผลลัพธ์ได้อย่างไร

คำตอบ

460 user3942918 Mar 28 2015 at 02:38

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";
}


ช็อคโกแลตเคลือบด้วย
เมเปิ้ลโรย

หรือยุ่งเกี่ยวกับฟังก์ชันอาร์เรย์ในตัวพันล้าน


การเข้าถึงรายการที่ซ้อนกัน

คุณสมบัติของวัตถุและองค์ประกอบของอาร์เรย์อาจจะมีวัตถุเพิ่มเติมและ / หรืออาร์เรย์ - $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' คือ 'ค่าฟู'
ค่าของคีย์ 'บาร์' คือ 'ค่าบาร์'
ค่าของคีย์ 'baz' คือ 'ค่า baz'


ไม่รู้ว่าข้อมูลมีโครงสร้างอย่างไร

อ่านเอกสารเกี่ยวกับสิ่งที่คุณได้รับ 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

สิ่งนี้เกิดขึ้นเนื่องจาก:

  1. JSON nullประกอบด้วยทั้งหมดของเพียงแค่นั้น
  2. JSON ไม่ถูกต้อง - ตรวจสอบผลของjson_last_error_msgหรือใส่มันผ่านสิ่งที่ต้องการJSONLint
  3. ประกอบด้วยองค์ประกอบที่ซ้อนอยู่ลึกกว่า 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

19 MohdAbdulMujib Oct 26 2016 at 20:24

คุณสามารถใช้json_decode ()เพื่อแปลงสตริง json เป็นอ็อบเจ็กต์ / อาร์เรย์ PHP

เช่น.

อินพุต:

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

ข้อควรจำเล็กน้อย:

  • json_decodeต้องสตริงจะเป็นที่ถูกต้องอื่นมันจะกลับมาjsonNULL
  • ในกรณีที่เกิดความล้มเหลวในการถอดรหัสjson_last_error()สามารถใช้เพื่อกำหนดลักษณะที่แน่นอนของข้อผิดพลาด
  • ตรวจสอบว่าคุณส่งผ่านutf8เนื้อหาหรือjson_decodeอาจผิดพลาดและส่งคืนNULLค่า
2 Sayeedamin Nov 06 2019 at 19:31
// Using json as php array 

$json = '[{"user_id":"1","user_name":"Sayeed Amin","time":"2019-11-06 13:21:26"}]';

//or use from file
//$json = file_get_contents('results.json');

$someArray = json_decode($json, true);

foreach ($someArray as $key => $value) {
    echo $value["user_id"] . ", " . $value["user_name"] . ", " . $value["time"] . "<br>";
}
1 KankatalaKrishna Aug 06 2019 at 13:08

เราสามารถถอดรหัสสตริง json ลงในอาร์เรย์โดยใช้ฟังก์ชัน json_decode ใน php

1) json_decode ($ json_string) // ส่งคืนวัตถุ

2) json_decode ($ json_string, true) // ส่งคืนอาร์เรย์

$json_string = '{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';
$array = json_decode($json_string,true);

echo $array['type']; //it gives donut
PaulBurilichev Jan 22 2020 at 21:48

ลองใช้JSONPath https://packagist.org/packages/flow/jsonpath

มีคำอธิบายที่ชัดเจนเกี่ยวกับวิธีใช้และแยกวิเคราะห์ไฟล์ JSON เพื่อหลีกเลี่ยงการวนซ้ำทั้งหมดที่เสนอ หากคุณมีความคุ้นเคยกับXPathสำหรับXMLคุณจะเริ่มต้นความรักวิธีนี้