JSON'dan PHP ile nasıl veri çıkarırım?

Mar 28 2015

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

460 user3942918 Mar 28 2015 at 02:38

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:

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 trueikinci 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:

  1. JSON tamamen bundan oluşur null.
  2. JSON geçersiz - sonucunu kontrol edin json_last_error_msgveya JSONLint gibi bir şeye koyun .
  3. 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:


Nasıl sıralanır

Bakınız: Referans: PHP'de dizileri ve verileri sıralamanın tüm temel yolları .

19 MohdAbdulMujib Oct 26 2016 at 20:24

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_decodedizenin geçerli olmasını gerektirir, jsonaksi takdirde geri dönecektir NULL.
  • 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 , aksi json_decodetakdirde hata verebilir ve yalnızca bir NULLdeğer döndürebilirsiniz .
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

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
PaulBurilichev Jan 22 2020 at 21:48

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 XPathiçin XMLbu yaklaşımı seven başlayacaktır.