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


214

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

ฉันมี JSON:

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

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


1
ที่เกี่ยวข้อง: สามารถดูตัวแปรในเอาต์พุต print_r () ของ แต่ไม่แน่ใจว่าวิธีการเข้าถึงในรหัสการสำรวจ JSON แบบโต้ตอบในบริบทของ PHP เป็นไปได้ที่นี่: array.include-once.org
hakre

โปรดฉันจะรู้ว่าทำไมคำถามนี้ได้พิจารณาว่าเป็นคำถามที่ซ้ำกันแม้แต่ 9 หรือน้อยกว่าผู้ใช้ทำเครื่องหมายเป็นซ้ำสำหรับstackoverflow.com/questions/4343596/parsing-json-file-with-php ? M
ฉันเป็นคนที่โง่ที่สุดใน

@IamtheMostStupidPerson ฉันจะพยายามอธิบายถึงแม้ว่าชื่อผู้ใช้ของคุณทำให้ฉันสงสัยว่าคุณจะได้รับ;) คำถามนี้ถูกถามและคำตอบถูกเขียนด้วยวิธี "มาตรฐาน" ดังนั้นจึงเป็นผู้รับที่ดีกว่าสำหรับเป้าหมายซ้ำซ้อนกว่าคำถามอื่น
Félix Gagnon-Grenier

คำตอบ:


428

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

สิ่งนี้เกิดขึ้นเพราะ:

  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


เพิ่งพบคำตอบนี้และพบว่าลิงก์ไปยังarray.include-once.orgนั้นใช้งานไม่ได้
Jeff

@ เจฟฟ์ขอบคุณ น่าอายเกี่ยวกับเรื่องนั้น ฉันลบลิงค์แล้ว
user3942918

ใช่พิจารณาชื่อของลิงก์และวิธีการที่คุณอธิบายมันดูเหมือนว่าคนเกียจคร้านจริง
Jeff

สิ่งเดียวที่โซลูชันนี้ขาดคือวิธีดึงข้อมูลจากไฟล์ json อื่น ฉันอยากจะแนะนำ solutuon นี้: stackoverflow.com/questions/19758954/…
Ishan Srivastava

มันเยี่ยมมาก ขอบคุณ.
David Kariuki

17

คุณสามารถใช้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ค่า

พวกเขาอาจไม่ชอบความเรียบง่ายของมันอย่างไรก็ตาม คุณสามารถโหวตได้เสมอ)
Mohd Abdul Mujib

1
อาจเป็นไปได้ว่าเหตุผลที่น่าจะเป็นมากกว่านั้นคือมันได้รับการตอบแล้วและดูเหมือนว่า @MohdAbdulMujib นั้นเป็นตัวแทนอิสระบางคน
Isaac

3
@Isaac บางคนอาจไม่กระตือรือร้นในการอ่านคู่มือทั้งหมดเมื่อต้องการเริ่มใช้งานฟังก์ชั่น มิฉะนั้นพวกเขาก็ควรอ่านเอกสารทางการ ประเด็นทั้งหมดของ SO คือความเรียบง่ายที่คำตอบมีให้ IMHO
Mohd Abdul Mujib

3
// 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

เราสามารถถอดรหัสสตริง 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

0

พิจารณาใช้JSONPath https://packagist.org/packages/flow/jsonpath

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


-1

ฉันได้เขียนแพ็คเกจชื่อJSON( GitHub , Packagist ) หากคุณต้องการป้องกันjson_*ฟังก์ชั่นค่าใช้จ่ายคุณควรลอง

ตัวอย่าง

use MAChitgarha\Component\JSON;

$jsonStr = <<<JSON
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}
JSON;

// Create an instance
$json = new JSON($jsonStr);

// Get a nested element using dots
$json->get("toppings.1.type"); // Chocolate with Sprinkles
$json["toppings.1.type"]; // Chocolate with Sprinkles

// Iterate over an element
foreach ($json->iterate("toppings") as $item)
    echo "{$item->id}: {$item->type}", PHP_EOL;

// Change an element
$json->set("toppings.3", [
    "id" => "5000",
    "type" => "Unknown"
]);

// Get data as JSON string, array or object, respectively
$json->getDataAsJson();
$json->getDataAsArray();
$json->getDataAsObject();

ดูวิกิหรือการสอนด่วนเพื่อทำความคุ้นเคย

นอกจากนี้หากคุณต้องการอ่านไฟล์ JSON และดึงข้อมูลออกมา (ดูเหมือนว่าคุณกำลังพยายามทำสิ่งนี้) ให้ดูแพ็คเกจJSONFileซึ่งฉันได้เขียนไว้เช่นกัน


-2

https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w

ตรวจสอบด้านล่างสำหรับการแปลง JSON เพื่ออาร์เรย์PHPถ้า JSON ถูกต้องแล้วjson_decode()ทำงานได้ดีและจะกลับอาร์เรย์ แต่ถ้าไม่ถูกต้อง JSON แล้วมันจะกลับมาNULL,

<?php
function jsonDecode1($json){
    $arr = json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );

หาก JSON มีรูปแบบไม่ถูกต้องและคุณคาดหวังว่าจะมีเฉพาะอาเรย์เท่านั้นคุณสามารถใช้ฟังก์ชันนี้ได้

<?php
function jsonDecode2($json){
    $arr = (array) json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );

หาก JSON มีรูปแบบไม่ถูกต้องและคุณต้องการหยุดการเรียกใช้โค้ดคุณสามารถใช้ฟังก์ชันนี้ได้

<?php
function jsonDecode3($json){
    $arr = (array) json_decode($json, true);

    if(empty(json_last_error())){
        return $arr;
    }
    else{
        throw new ErrorException( json_last_error_msg() );
    }
}

// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );

คุณสามารถใช้ฟังก์ชั่นใด ๆ ขึ้นอยู่กับความต้องการของคุณ

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