PHP JSON ayrıştırma

3 Cevap php

Ben bir PHP komut dosyası döndürülen JSON nesne yineleme çalışıyorum. Dönüş parçası gibi bir şeydir:

$json = array("result" => -1, 
    "errors" => array(
    "error1" => array("name" => "email","value" => "err1"),
    "error2" => array("name" => "pass","value" => "err2")
        )
        ); 

$encoded = json_encode($json);
echo $encoded;

Yani, JavaScript yapabilirim:

var resp = eval('(' + transport.responseText + ')');
alert(resp.length);
alert(resp.errors.error1.name);

Ama ben yapamam:

alert(resp.errors.length);

Ben uzunluğu almak için çalışıyorum, bu yüzden errors yinelemek istiyorum. Biri bana bir ipucu verebilir misiniz? Teşekkürler!

3 Cevap

Bunu yapabilmek için, resp.errors, bir Javascript dizi değil, bir Javascript nesnesi olması gerekir.

PHP, diziler adında anahtarları olabilir; Bu JavaScript mümkün değildir; json_encode kullanılırken, bu yüzden, errors PHP dizi JS nesnesine "tercüme": sizin JSON verileri bu gibi görünüyor:

{"result":-1,"errors":{"error1":{"name":"email","value":"err1"},"error2":{"name":"pass","value":"err2"}}}

Bunun yerine, bu gibi bakmak isterim:

{"result":-1,"errors":[{"name":"email","value":"err1"},{"name":"pass","value":"err2"}]}

Dikkat edin "errors" bir dizide, adlı-anahtarları olmadan.

Bunu başarmak için, PHP kodu olması gerekir:

$json = array(
    "result" => -1, 
    "errors" => array(
            array("name" => "email","value" => "err1"),
            array("name" => "pass","value" => "err2")
        )
    ); 
$encoded = json_encode($json);
echo $encoded;

(Just remove the named-keys on errors)

Lütfen JSON çıkışta bir görünüm var. resp.errors bu gibi bir şey olacaktır:

{"error1": {"name": "email", "value": "err1"}, ...}

Gördüğünüz gibi (bunu bir associative dizisi değil, bir sayısal indisli bir dizi geçti beri.), Bir nesne değil, bir dizi var JavaScript bir nesne üzerinden döngü istiyorsanız, bunu şöyle yapın :

for (var error in resp.errors) {
    alert(resp.errors[error].name);
}

Eğer bir JavaScript dizisi olmasını istiyorsanız, PHP bu gibi görünmelidir:

$json = array("result" => -1, "errors" => array(
    array("name" => "email","value" => "err1"),
    array("name" => "email","value" => "err1")
));

Eğer Firebug değerlendirilen nesneyi incelemek, "hataları" bir dizi değil ama bir nesne (PHP ilişkili diziler JS itiraz çevirir) olduğunu görürdünüz. Yani bir nesneye yineleme yapmak için for-in deyimi kullanmak gerekir.

Sen hasOwnProperty bunu gönderdiğiniz bir şey değil, bazı prototip özelliği olduğundan emin olmak için her özellik adını kontrol etmek gerekir.