ฉันจะดึงข้อมูลจาก JSON ด้วย PHP ได้อย่างไร
นี่เป็นคำถามอ้างอิงทั่วไปและคำตอบที่ครอบคลุมคำถามที่ไม่มีวันจบสิ้น"ฉันจะเข้าถึงข้อมูลใน JSON ของฉันได้อย่างไร" คำถาม ที่นี่เพื่อจัดการพื้นฐานกว้าง ๆ ของการถอดรหัส JSON ใน PHP และเข้าถึงผลลัพธ์
ฉันมี JSON:
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
ฉันจะถอดรหัสสิ่งนี้ใน PHP และเข้าถึงข้อมูลผลลัพธ์ได้อย่างไร
คำตอบ
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
สิ่งนี้เกิดขึ้นเนื่องจาก:
- 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
คุณสามารถใช้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
ต้องสตริงจะเป็นที่ถูกต้องอื่นมันจะกลับมาjson
NULL
- ในกรณีที่เกิดความล้มเหลวในการถอดรหัส
json_last_error()
สามารถใช้เพื่อกำหนดลักษณะที่แน่นอนของข้อผิดพลาด - ตรวจสอบว่าคุณส่งผ่าน
utf8
เนื้อหาหรือjson_decode
อาจผิดพลาดและส่งคืนNULL
ค่า
// 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>";
}
เราสามารถถอดรหัสสตริง 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
ลองใช้JSONPath
https://packagist.org/packages/flow/jsonpath
มีคำอธิบายที่ชัดเจนเกี่ยวกับวิธีใช้และแยกวิเคราะห์ไฟล์ JSON เพื่อหลีกเลี่ยงการวนซ้ำทั้งหมดที่เสนอ หากคุณมีความคุ้นเคยกับXPath
สำหรับXML
คุณจะเริ่มต้นความรักวิธีนี้