Bagaimana cara mengekstrak data dari JSON dengan PHP?
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
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:
- skalar: string , int , float , dan bools
- nulls (jenis khusus sendiri)
- tipe gabungan: objek dan array .
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 true
sebagai 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:
- JSON seluruhnya terdiri dari itu
null
,. - JSON tidak valid - periksa hasil dari
json_last_error_msg
atau letakkan melalui sesuatu seperti JSONLint . - 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 .
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_decode
membutuhkan string menjadi validjson
jika tidak ia akan kembaliNULL
.- Jika terjadi kegagalan untuk memecahkan kode,
json_last_error()
dapat digunakan untuk menentukan sifat kesalahan yang tepat. - Pastikan Anda mengirimkan
utf8
konten, ataujson_decode
mungkin error dan hanya mengembalikanNULL
nilai.
// 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>";
}
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
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 XPath
untuk XML
Anda akan mulai mencintai pendekatan ini.