Bagaimana cara mengekstrak data dari JSON dengan PHP?

Mar 28 2015

Ini dimaksudkan sebagai referensi pertanyaan dan jawaban umum yang mencakup banyak pertanyaan "Bagaimana cara mengakses data di JSON saya?" pertanyaan. Ini di sini untuk menangani dasar-dasar umum decoding JSON di PHP dan mengakses hasilnya.

Saya memiliki JSON:

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

Bagaimana cara memecahkan kode ini di PHP dan mengakses data yang dihasilkan?

Jawaban

460 user3942918 Mar 28 2015 at 02:38

Intro

Pertama Anda memiliki string. JSON bukanlah larik, objek, atau struktur data. JSON adalah format serialisasi berbasis teks - jadi string mewah, tapi tetap hanya string. Dekodekan dalam PHP dengan menggunakan json_decode().

 $data = json_decode($json);

Di sana Anda mungkin menemukan:

Ini adalah hal-hal yang dapat dikodekan di JSON. Atau lebih tepatnya, ini adalah versi PHP dari hal-hal yang dapat dikodekan di JSON.

Tidak ada yang istimewa dari mereka. Mereka bukan "objek JSON" atau "array JSON". Anda telah memecahkan kode JSON - Anda sekarang memiliki jenis PHP dasar sehari-hari .

Objek akan menjadi contoh stdClass , kelas bawaan yang hanya merupakan hal umum yang tidak penting di sini.


Mengakses properti objek

Anda mengakses properti dari salah satu objek ini dengan cara yang sama seperti yang Anda lakukan untuk properti non-statis publik dari objek lain, mis $object->property.

$json = '
{
    "type": "donut",
    "name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut

Mengakses elemen array

Anda mengakses elemen dari salah satu larik ini dengan cara yang sama seperti yang Anda lakukan untuk larik lainnya, mis $array[0].

$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles

Ulangi dengan foreach.

foreach ($toppings as $topping) {
    echo $topping, "\n";
}

Glazed
Chocolate dengan Sprinkles
Maple

Atau main-main dengan salah satu dari bazillion built-in array functions .


Mengakses item bersarang

Properti objek dan elemen array mungkin lebih banyak objek dan / atau array - Anda dapat terus mengakses properti dan anggotanya seperti biasa, mis $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

Meneruskan truesebagai argumen kedua ke json_decode ()

Saat Anda melakukan ini, alih-alih objek, Anda akan mendapatkan array asosiatif - array dengan string untuk kunci. Sekali lagi Anda mengakses elemennya seperti biasa, mis $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

Mengakses item array asosiatif

Saat mendekode objek JSON ke array PHP asosiatif, Anda dapat mengulang kunci dan nilai menggunakan foreach (array_expression as $key => $value)sintaks, mis.

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

Cetakan

Nilai kunci 'foo' adalah 'nilai foo'
Nilai kunci 'bar' adalah 'nilai bar'
Nilai kunci 'baz' adalah 'nilai baz'


Tidak tahu bagaimana data disusun

Baca dokumentasi untuk mengetahui asal JSON tersebut.

Lihatlah JSON - di mana Anda melihat tanda kurung kurawal {}mengharapkan objek, di mana Anda melihat tanda kurung siku []mengharapkan sebuah larik.

Tekan data yang diterjemahkan dengan 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);

dan periksa hasilnya:

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
                )

        )

)

Ini akan memberi tahu Anda di mana Anda memiliki objek, di mana Anda memiliki array, bersama dengan nama dan nilai anggotanya.

Jika Anda hanya bisa mendapatkan begitu jauh ke dalamnya sebelum Anda tersesat - pergi yang jauh dan hit yang dengan print_r():

print_r($yummy->toppings[0]);
stdClass Object
(
    [id] => 5002
    [type] => Glazed
)

Lihatlah di penjelajah JSON interaktif yang praktis ini .

Pecahkan masalah menjadi beberapa bagian yang lebih mudah dibungkus.


json_decode() kembali null

Ini terjadi karena:

  1. JSON seluruhnya terdiri dari itu null,.
  2. JSON tidak valid - periksa hasil dari json_last_error_msgatau letakkan melalui sesuatu seperti JSONLint .
  3. Ini berisi elemen bersarang lebih dari 512 level. Kedalaman maks default ini dapat diganti dengan meneruskan integer sebagai argumen ketiga ke json_decode().

Jika Anda perlu mengubah kedalaman maksimal, Anda mungkin memecahkan masalah yang salah. Cari tahu mengapa Anda mendapatkan data bersarang yang begitu dalam (misalnya layanan yang Anda kueri yang menghasilkan JSON memiliki bug) dan hal itu tidak akan terjadi.


Nama properti objek mengandung karakter khusus

Terkadang Anda akan memiliki nama properti objek yang berisi sesuatu seperti tanda hubung -atau tanda @yang tidak dapat digunakan dalam pengenal literal. Sebagai gantinya Anda dapat menggunakan string literal dalam kurung kurawal untuk mengatasinya.

$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42

Jika Anda memiliki integer sebagai properti, lihat: Bagaimana cara mengakses properti objek dengan nama seperti integer? sebagai referensi.


Seseorang meletakkan JSON di JSON Anda

Ini konyol tetapi itu terjadi - ada JSON yang dikodekan sebagai string dalam JSON Anda. Decode, akses string seperti biasa, decode itu , dan akhirnya dapatkan apa yang Anda butuhkan.

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';

$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);

echo $toppings[0]->type; //Glazed

Data tidak muat di memori

Jika JSON Anda terlalu besar untuk json_decode()ditangani sekaligus, hal-hal mulai menjadi rumit. Lihat:


Bagaimana memilahnya

Lihat: Referensi: semua cara dasar untuk mengurutkan array dan data dalam PHP .

19 MohdAbdulMujib Oct 26 2016 at 20:24

Anda dapat menggunakan json_decode () untuk mengonversi string json menjadi objek / array PHP.

Misalnya.

Memasukkan:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

Keluaran:

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

Beberapa Poin yang perlu diingat:

  • json_decodemembutuhkan string menjadi valid jsonjika tidak ia akan kembali NULL.
  • Jika terjadi kegagalan untuk memecahkan kode, json_last_error()dapat digunakan untuk menentukan sifat kesalahan yang tepat.
  • Pastikan Anda mengirimkan utf8konten, atau json_decodemungkin error dan hanya mengembalikan NULLnilai.
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

Kita dapat mendekode string json menjadi array menggunakan fungsi json_decode di php

1) json_decode ($ json_string) // mengembalikan objek

2) json_decode ($ json_string, true) // mengembalikan array

$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

Pertimbangkan untuk menggunakan JSONPath https://packagist.org/packages/flow/jsonpath

Ada penjelasan yang cukup jelas tentang bagaimana menggunakannya dan mengurai file JSON menghindari semua loop yang diusulkan. Jika Anda sudah familiar dengan XPathuntuk XMLAnda akan mulai mencintai pendekatan ini.