Dizeleri olarak PHP kodlama json_encode numaraları

11 Cevap php

Ben PHP json_encode fonksiyonu ile bir sorun yaşıyorum. Bu örneğin dizeleri gibi sayıları kodlar

array('id' => 3)

olur

"{ ["id": "3", ...)

Js bu değerleri karşılaştığında dizeleri ve sayısal işlemleri onlara başarısız olarak, onları yorumlar. Dizeleri gibi sayıları kodlayan dan json_encode önlemek için herkes bir yol biliyor mu? Teşekkür ederiz!

11 Cevap

Ben çok hızlı bir test yaptık:

$a = array(
    'id' => 152,
    'another' => 'test',
    'ananother' => 456,
);
$json = json_encode($a);
echo $json;

Bu yanılmıyorsam eğer, ne tarif gibi görünüyor?

Ve ben çıkış olarak alıyorum:

{"id":152,"another":"test","ananother":456}

Yani, bu durumda, tamsayılar dizgeye dönüştürülür edilmemiştir.


Still, this might be dependant of the version of PHP we are using : there have been a couple of json_encode related bugs corrected, depending on the version of PHP...

Bu test PHP 5.2.6 ile yapılmış; PHP 5.2.9 ve 5.3.0 ile aynı şeyi alıyorum; Ben test etmek için başka 5.2.x sürümü var, ama :-( yok

PHP hangi sürümünü kullanıyorsunuz? Ya da test case deftere örnek daha karmaşıktır?

Belki tek hata raporu http://bugs.php.net/ ile ilgili olabilir? Örneğin, Bug #40503 : json_encode integer conversion is inconsistent with PHP?


Maybe Bug #38680 could interest you too, btw ?

PHP 5.3.3 dan seçenekleri parametre PHP 5.3.0 ilave ederken, otomatik dönüştürme sayılar için bir bayrak, var unutmayın:

$arr = array( 'row_id' => '1', 'name' => 'George' );
echo json_encode( $arr, JSON_NUMERIC_CHECK ); // {"row_id":1,"name":"George"}

Ben aynı sorunu (PHP-5.2.11/Windows) karşılaşmak ediyorum. Bu geçici çözümü kullanıyorum

$json = preg_replace( "/\"(\d+)\"/", '$1', $json );

hangi tüm (non-negatif, tamsayı) yerini sayının kendisi ('"42'" '42 olur ') ile tırnak içine sayılar.

Ayrıca bakınız this comment in PHP manual.

Ben, aynı şekilde bir DB (PostgreSQL) okuyordu ve her şey bir dizi oldu. Biz her satır üzerinde döngü ve bizim nihai sonuçları dizi kurmak için onunla şeyler yapmak, bu yüzden kullanılan

$result_arr[] = array($db_row['name'], (int)$db_row['count']);

bir tamsayı değeri olmasını zorlamak için döngü içinde. Ben ne zaman json_encode($result_arr) şimdi, doğru bir sayı olarak biçimlendirir. Bu sen ve veritabanından gelen bir sayı değil kontrol etmenizi sağlar.

EDIT:

json_encode() fonksiyonu da buna ikinci bir argüman olarak JSON_NUMERIC_CHECK bayrağını kullanarak anında bunu yapmak için yeteneğine sahiptir. http://uk3.php.net/manual/en/function.json-encode.php#106641: Sen olarak (aşağıda kopyalanan) belgelerinde bu kullanıcıların örnekte gösterilen olsa onu kullanırken dikkatli olmak gerekir

<?php
// International phone number
json_encode(array('phone_number' => '+33123456789'), JSON_NUMERIC_CHECK);
?>

Ve sonra bu JSON olsun:

{"phone_number":33123456789}

Aşağıdaki test dize türünü değiştirme (çift tırnak ile çevrili yani) bir JSON dize olarak bir sayısal dönmek için () json_encode neden olduğunu doğrulamaktadır. Bunu düzeltmek için setType (dizi ["var"], "tamsayı") veya settype ($ dizi ["var"], "şamandıra") kullanın.

<?php

class testclass {
    public $foo = 1;
    public $bar = 2;
    public $baz = "Hello, world";
}

$testarr = array( 'foo' => 1, 'bar' => 2, 'baz' => 'Hello, world');

$json_obj_txt = json_encode(new testclass());
$json_arr_txt = json_encode($testarr);

echo "<p>Object encoding:</p><pre>" . $json_obj_txt . "</pre>";
echo "<p>Array encoding:</p><pre>" . $json_arr_txt . "</pre>";

// Both above return ints as ints. Type the int to a string, though, and...
settype($testarr["foo"], "string");
$json_arr_cast_txt = json_encode($testarr);
echo "<p>Array encoding w/ cast:</p><pre>" . $json_arr_cast_txt . "</pre>";

?>

Eh, PHP json_encode () bir dize döndürür.

Gerçi js kodunda parseFloat () veya parseInt () kullanabilirsiniz:

parseFloat('122.5'); // returns 122.5
parseInt('22'); // returns 22
parseInt('22.5'); // returns 22

Bütünlüğü uğruna (Henüz Yorum eklemek değil gibi) için, bana da başka bir cevap olarak bu ayrıntıyı ekleyelim:

(Edit: OP'ın durumda, veritabanı sonuç kümesi) kaynak veri (yani dizeleri gibi sayısal sütunları dönen tarafından () sorun olabileceğini fark sonra okumak, ve aslında json_encode () sorun kaynağı değildi edilecektir)

Hem "mysql_fetch_array" Manuel sayfalar:

Bir array of strings getirilen satıra karşılık geldiğini döndürür,

... Ve "mysql_ fetch_ row":

Returns an numerical array of strings that corresponds to the fetched row

açıkça belirtiyor; dönen dizide girişleri dizeleri olacaktır.

(I ") (sql_fetchrow")! Eskimiş, Evet biliyorum (phpBB2 içinde DB sınıfını kullanarak edildi ve bu sınıfın yöntem kullanır "mysql_fetch_array ()")

Farkında değil, ben de bu soruyu bulma ve anlama sorunu sona erdi! :)

Pascal Martin onun takip yorum yukarıda belirtildiği gibi, ben kaynağında "yanlış tipi" sorunu halleder bir çözüm inanıyorum ("mysql_field_type()" fonksiyonunu kullanarak ve hemen sonra döküm yaparak yani , fetch (veya diğer "nesne" gibi yöntemler fetch?)) genel olarak daha iyi olurdu.

Bu sürüm özgü bir sorun olduğu ortaya çıkıyor. Bazen bir MySQL veritabanı bir çekme doğru türlerini koruyacaktır. Eski sürümlerinde, bir dize olarak her şeyi iade edebilir.

I wrote about it this morning. http://shakyshane.com/blog/output-json-from-php.html

Eğer Zend_Json::encode kullanarak ve benzer bir sorun yaşıyorsanız, Zend_Db olasılıkla suçlu.

Bu soruya bir göz atın: fetching an Integer from DB using Zend Framework returns the value as a string

Sadece aynı sorun haline çalıştırmak ve veritabanı dizeleri gibi değerleri dönüyordu.

Ben geçici bir çözüm olarak kullanın:

$a = array(
    'id' => $row['id'] * 1,
    'another' => ...,
    'ananother' => ...,
);
$json = json_encode($a);

Bu bir dizi içine atmak için 1 değerini çarpılması

O birisi yardımcı olur umarım

json_encode ağ üzerinden göndermek için JSON formatında bazı veri yapısını serileştirir. Bu nedenle tüm içerik türü dize olacaktır. Eğer $ _POST veya $ _GET bazı parametre almak zaman olduğu gibi.

Sadece (PHP veya Javascript parseInt () in intval() function) ile ilk int onları dönüştürmek ve sonra işlemleri yürütmek, gönderilen değerler sayısal işlemleri yapmak için varsa.