JSON'dan PHP ile nasıl veri çıkarırım?
Bu, hiç bitmeyen "JSON'umdaki verilere nasıl erişirim?" Sorusunun çoğunu kapsayan genel bir referans soru ve cevabı olması amaçlanmıştır. sorular. PHP'de JSON kodunu çözmenin ve sonuçlara erişmenin geniş temellerini ele almak için burada.
JSON'a sahibim:
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
Bunu PHP'de nasıl çözebilirim ve elde edilen verilere nasıl erişebilirim?
Yanıtlar
Giriş
Öncelikle bir ipin var. JSON bir dizi, nesne veya veri yapısı değildir. JSON , metin tabanlı bir serileştirme biçimidir - yani süslü bir dizedir, ancak yine de yalnızca bir dizedir. Kullanarak PHP'de kodunu çözün json_decode()
.
$data = json_decode($json);
Orada bulabilirsin:
- skalarlar: dizeler , ints , floats ve bools
- null'lar (kendine ait özel bir tür)
- bileşik türler: nesneler ve diziler .
Bunlar JSON'da kodlanabilen şeylerdir. Ya da daha doğrusu, bunlar JSON'da kodlanabilen şeylerin PHP sürümleridir.
Onlarda özel bir şey yok. "JSON nesneleri" veya "JSON dizileri" değildirler. JSON'un kodunu çözdünüz - artık temel günlük PHP türlerine sahipsiniz .
Nesneler, burada önemli olmayan genel bir şey olan yerleşik bir sınıf olan stdClass'ın örnekleri olacaktır .
Nesne özelliklerine erişim
Sen erişmek özellikleri bunlardan birinin örneğin diğer eşyalar, kamu statik olmayan özellikleri için yapacağınız aynı şekilde nesneleri $object->property
.
$json = '
{
"type": "donut",
"name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type; //donut
Dizi öğelerine erişim
Bu dizilerden birinin elemanlarına, diğer diziler için yaptığınız gibi erişirsiniz, örn $array[0]
.
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
İle tekrarlayın foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Parçacıklı Akçaağaçlı Sırlı
Çikolata
Veya bazilyon yerleşik dizi işlevlerinden herhangi biriyle uğraşın .
Yuvalanmış öğelere erişim
Nesnelerin özellikleri ve dizilerin öğeleri daha fazla nesne ve / veya diziler olabilir - özelliklerine ve üyelerine her zamanki gibi erişmeye devam edebilirsiniz, örn $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
Geçme true
ikinci değişken olarak ) (json_decode
Bunu yaptığınızda, nesneler yerine ilişkilendirilebilir diziler - anahtarlar için dizeler içeren diziler elde edersiniz. Yine bunların öğelerine her zamanki gibi erişirsiniz, örn $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
İlişkilendirilebilir dizi öğelerine erişim
İlişkili bir PHP dizisine bir JSON nesnesinin kodunu çözerken, foreach (array_expression as $key => $value)
sözdizimini kullanarak hem anahtarları hem de değerleri yineleyebilirsiniz , örn.
$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;
}
Baskılar
"Foo" anahtarının değeri "foo değeri" dir
Anahtar "bar" ın değeri "bar değeri" dir
"baz" anahtarının değeri "baz değer" dir
Verilerin nasıl yapılandırıldığını bilmiyorum
JSON'u nereden aldığınızı öğrenmek için belgeleri okuyun.
JSON'a bakın - burada küme parantezlerinin {}
bir nesne beklediğini, köşeli parantezlerin []
bir dizi beklediğini gördüğünüz yerde .
Çözülmüş verilere bir 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);
ve çıktıyı kontrol edin:
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
)
)
)
Nesnelerin nerede olduğunu, dizilerin nerede olduğunu, üyelerinin adları ve değerleri ile birlikte size söyleyecektir.
Yalnızca şu ana kadar içine sen kaybolmak önce alabilirsiniz - uzak ve isabet o gitmek olduğunu ile print_r()
:
print_r($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
Bu kullanışlı etkileşimli JSON gezgininde buna bir göz atın .
Sorunu, başınızı sarması daha kolay parçalara ayırın.
json_decode()
İadeler null
Bunun nedeni şunlardan biri:
- JSON tamamen bundan oluşur
null
. - JSON geçersiz - sonucunu kontrol edin
json_last_error_msg
veya JSONLint gibi bir şeye koyun . - 512 düzeyden daha derin iç içe geçmiş öğeler içerir. Bu varsayılan maksimum derinlik, üçüncü bağımsız değişken olarak bir tam sayı iletilerek geçersiz kılınabilir
json_decode()
.
Maksimum derinliği değiştirmeniz gerekirse, muhtemelen yanlış problemi çözüyorsunuz. Neden bu kadar derinlemesine iç içe geçmiş veriler elde ettiğinizi öğrenin (örneğin, JSON'u oluşturan, sorguladığınız hizmette bir hata var) ve bunun olmamasını sağlayın.
Nesne özellik adı özel bir karakter içeriyor
Bazen, tire -
veya işaret gibi bir şey içeren @
ve değişmez tanımlayıcıda kullanılamayan bir nesne özelliği adına sahip olursunuz . Bunun yerine, onu ele almak için kaşlı ayraçlar içinde bir dize değişmezi kullanabilirsiniz.
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
Özellik olarak bir tamsayınız varsa, bkz: Tamsayı gibi adlarla nesne özelliklerine nasıl erişilir? referans olarak.
Birisi JSON'nuza JSON koydu
Gülünç ama oluyor - JSON'nuzda bir dize olarak kodlanmış JSON var. Kod Çözme, erişim zamanki gibi dize, kod çözme olduğunu en sonunda neye ihtiyacınız olsun, vb.
$json = '
{
"type": "donut",
"name": "Cake",
"toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';
$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);
echo $toppings[0]->type; //Glazed
Veriler belleğe sığmıyor
JSON'nuz bir anda işlenemeyecek kadar büyükse json_decode()
işler karmaşıklaşmaya başlar. Görmek:
- PHP'de büyük JSON dosyalarını işleme
- Büyük bir json dosyasıyla nasıl düzgün bir şekilde yineleme yapılır
Nasıl sıralanır
Bakınız: Referans: PHP'de dizileri ve verileri sıralamanın tüm temel yolları .
Bir json dizesini PHP nesnesine / dizisine dönüştürmek için json_decode () kullanabilirsiniz .
Örneğin.
Giriş:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
Çıktı:
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)
}
Hatırlanması gereken birkaç nokta:
json_decode
dizenin geçerli olmasını gerektirir,json
aksi takdirde geri dönecektirNULL
.- Kod çözmede başarısızlık durumunda, hatanın
json_last_error()
tam yapısını belirlemek için kullanılabilir. utf8
İçeriği ilettiğinizden emin olun , aksijson_decode
takdirde hata verebilir ve yalnızca birNULL
değer döndürebilirsiniz .
// 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>";
}
Php'de json_decode işlevini kullanarak json dizesini diziye çözebiliriz
1) json_decode ($ json_string) // nesneyi döndürür
2) json_decode ($ json_string, true) // dizi döndürür
$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
Https://packagist.org/packages/flow/jsonpath kullanmayı düşününJSONPath
Bunun nasıl kullanılacağına ve önerilen tüm döngülerden kaçınarak bir JSON dosyasını nasıl ayrıştıracağına dair oldukça net bir açıklama var . Eğer aşina değilseniz XPath
için XML
bu yaklaşımı seven başlayacaktır.