giriş
Öncelikle bir ipin var. JSON bir dizi, nesne veya veri yapısı değildir. JSON metin tabanlı bir serileştirme biçimidir - bu yüzden süslü bir dize, ancak yine de sadece bir dize. PHP kullanarak kodunu çöz json_decode()
.
$data = json_decode($json);
Orada bulabilirsiniz:
Bunlar JSON'da kodlanabilen şeyler. Ya da daha doğrusu, bunlar PHP'nin JSON'da kodlanabilen şeylerin PHP versiyonlarıdır.
Onlar hakkında özel bir şey yok. Bunlar "JSON nesneleri" veya "JSON dizileri" değildir. JSON kodunu çözdünüz - artık temel günlük PHP türleriniz var .
Nesneler, burada önemli olmayan genel bir şey olan yerleşik bir sınıf olan stdClass örnekleri olacaktır .
Nesne özelliklerine erişme
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şme
Bu dizilerden birinin öğelerine, diğer herhangi bir dizi 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
Üzerinde yinelemek foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Sprinkles
Akçaağaç ile Sırlı Çikolata
Veya bazilyon yerleşik dizi işlevlerinden herhangi biriyle uğraşın .
Yuvalanmış öğelere erişme
Nesnelerin özellikleri ve dizilerin öğeleri daha fazla nesne ve / veya dizi 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
Json_decode ()true
öğesine ikinci argüman olarak geçme
Bunu yaptığınızda, nesneler yerine ilişkilendirilebilir diziler elde edersiniz - anahtar dizeleri içeren diziler. Yine, elemanlarına 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şme
Bir JSON nesnesini ilişkilendirilebilir bir PHP dizisine çözerken foreach (array_expression as $key => $value)
sözdizimini kullanarak hem anahtarları hem de değerleri yineleyebilirsiniz , ör.
$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'
'bar' anahtarının değeri 'bar değeri'
'baz' anahtarının değeri 'baz değeri'
Verilerin nasıl yapılandırıldığını bilmiyorum
JSON'u aldığınız her ne olursa olsun belgeleri okuyun.
Kıvırcık parantezlerin {}
bir nesne beklediğini gördüğünüz JSON'a bakın , burada köşeli parantezlerin []
bir dizi beklediğini görebilirsiniz .
Çözülen veriye aşağıdakilerle vurun 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 çıkışı 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
)
)
)
Üyelerinin adları ve değerleriyle birlikte, nesnelerinizin nerede, dizilerinizin olduğu yerlerde 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 explorer'da bir göz atın .
Sorunu kafanızı sarmak için daha kolay parçalara ayırın.
json_decode()
İadeler null
Bunun nedeni şu olabilir:
- JSON tamamen bundan ibarettir
null
.
- JSON geçersiz - sonucunu kontrol edin
json_last_error_msg
veya JSONLint gibi bir şeye koyun .
- 512'den fazla derinlikte yuvalanmış öğeler içerir. Bu varsayılan maksimum derinlik, üçüncü argüman olarak bir tamsayı iletilerek geçersiz kılınabilir
json_decode()
.
Maksimum derinliği değiştirmeniz gerekirse, muhtemelen yanlış sorunu çözersiniz. Neden bu kadar derinden iç içe veri elde ettiğinizi öğrenin (örneğin, sorguladığınız hizmetin JSON'u oluşturan bir hata vardır) ve bunun gerçekleşmemesini sağlayın.
Nesne özellik adı özel bir karakter içeriyor
Bazen , tam tanımlayıcıda kullanılamayan tire -
veya işaret gibi bir şey içeren bir nesne özellik adınız olur @
. Bunun yerine, süslemek için süslü parantez içinde bir dize hazır bilgisi kullanabilirsiniz.
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
Özellik olarak bir tamsayı varsa bkz: Tamsayılar gibi adlara sahip nesne özelliklerine nasıl erişilir? referans olarak.
Birisi JSON'u JSON'unuza koydu
Bu çok saçma ama oluyor - JSON'unuzda 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'unuz aynı json_decode()
anda işlemek için çok büyükse işler zorlaşmaya başlar. Görmek:
Nasıl sıralanır?
Bakınız: Referans: PHP'de dizileri ve verileri sıralamanın tüm temel yolları .