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