PHP ile JSON'dan nasıl veri ayıklayabilirim?


214

Bu, bitmeyen "JSON'umdaki verilere nasıl erişebilirim?" sorular. PHP'de JSON kodunun çözülmesi ve sonuçlara erişmenin geniş temellerini ele almak için buradayız.

Ben JSON var:

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

Bunu PHP'de nasıl çözer ve elde edilen verilere nasıl erişirim?



Bu sorunun neden stackoverflow.com/questions/4343596/parsing-json-file-with-php için kopya olarak işaretlenmiş 9 veya daha az kullanıcı bile neden yinelenen bir soru olarak değerlendirilmediğini lütfen anlayabilir miyim ? M
Ben En Aptal

@IamtheMostStupidPerson Açıklamaya çalışacağım, kullanıcı adınız beni alacağınızdan şüphe duysa bile;). Bu soru "kanonik" bir şekilde sorulur ve cevapları yazılır. Bu nedenle, yinelenen hedef için diğer sorulardan daha iyi bir alıcıdır.
Félix Gagnon-Grenier

Yanıtlar:


428

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:

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


sadece bu cevapta tökezledi ve array.include-once.org bağlantısının kopuk olduğunu gördü .
Jeff

@Jeff Teşekkürler. Utanç. Bağlantıyı kaldırdım.
user3942918

evet, bağlantının adı ve nasıl tanımladığınız göz önüne alındığında, gerçek bir bummer gibi geliyor.
Jeff

Bu çözümün eksik olduğu tek şey, başka bir json dosyasından nasıl veri alınacağıydı. Tavsiye ederim, bu çözüm: stackoverflow.com/questions/19758954/…
Ishan Srivastava

Bu harika. Teşekkür ederim.
David Kariuki

17

Bir json dizesini bir 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)
}

Unutulmaması gereken birkaç nokta:

  • json_decodedizenin geçerli jsonbaşka bir değer olmasını gerektirir NULL.
  • Kod çözme başarısızlığı durumunda, hatanın json_last_error()kesin doğasını belirlemek için kullanılabilir.
  • utf8İçeriği ilettiğinizden emin olun , yoksa json_decodehata verebilir ve yalnızca bir NULLdeğer döndürebilirsiniz .

yine de sadeliğini sevmemiş olabilirler. Her zaman upvote edebilirsiniz;)
Mohd Abdul Mujib

1
Muhtemelen daha olası neden zaten cevaplanmış olması ve @MohdAbdulMujib bazı ücretsiz temsilcisi sonra gibi görünüyor
Isaac

3
@Isaac bazı insanlar sadece işlevi kullanmaya başlamak istediklerinde tüm kılavuzu okumak istemeyebilir. Aksi takdirde resmi dokümanı okumaktan daha iyi olurlar. SO'nun tüm noktası, cevapların verildiği basitliktir. IMHO
Mohd Abdul Mujib

3
// 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

Php json_decode işlevini kullanarak diziye json dizisi çözebilir

1) json_decode ($ json_string) // nesne 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

0

Https://packagist.org/packages/flow/jsonpath kullanmayı düşününJSONPath

Nasıl kullanılacağı ve önerilen tüm döngülerden kaçınarak bir JSON dosyasını ayrıştırma konusunda oldukça açık bir açıklama var . Eğer aşina değilseniz XPathiçin XMLbu yaklaşımı seven başlayacaktır.


-1

JSON( GitHub , Packagist ) adında bir paket yazdım . json_*İşlevleri kullanmanın genel giderlerini önlemek istiyorsanız, denemelisiniz.

Misal

use MAChitgarha\Component\JSON;

$jsonStr = <<<JSON
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}
JSON;

// Create an instance
$json = new JSON($jsonStr);

// Get a nested element using dots
$json->get("toppings.1.type"); // Chocolate with Sprinkles
$json["toppings.1.type"]; // Chocolate with Sprinkles

// Iterate over an element
foreach ($json->iterate("toppings") as $item)
    echo "{$item->id}: {$item->type}", PHP_EOL;

// Change an element
$json->set("toppings.3", [
    "id" => "5000",
    "type" => "Unknown"
]);

// Get data as JSON string, array or object, respectively
$json->getDataAsJson();
$json->getDataAsArray();
$json->getDataAsObject();

Bunu öğrenmek için wiki'ye veya hızlı eğiticiye bakın .

Ayrıca, JSON dosyalarını okumak ve verilerini ayıklamak istiyorsanız (bunu gerçekleştirmeye çalıştığınız gibi), ben de yazdığım JSONFile paketine bakın .


-2

https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w

Json'u diziye dönüştürmek için aşağıdaki kodu kontrol edin PHP, JSON doğruysa json_decode()iyi çalışır ve bir dizi döndürür, Ancak hatalı biçimlendirilmiş JSON ise, o zaman geri döner NULL,

<?php
function jsonDecode1($json){
    $arr = json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );

JSON hatalı biçimlendirilmişse ve yalnızca dizi bekliyorsanız, bu işlevi kullanabilirsiniz,

<?php
function jsonDecode2($json){
    $arr = (array) json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );

JSON hatalı biçimlendirilmişse ve kod yürütülmesini durdurmak istiyorsanız, bu işlevi kullanabilirsiniz,

<?php
function jsonDecode3($json){
    $arr = (array) json_decode($json, true);

    if(empty(json_last_error())){
        return $arr;
    }
    else{
        throw new ErrorException( json_last_error_msg() );
    }
}

// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );

Gereksiniminize bağlı olarak herhangi bir işlevi kullanabilirsiniz,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.