2012-01-06 8 views
5

Yani bir WAMP ortamında php 5.2.6 kullanıyorum.PHP json_decode, çok büyük tamsayı değerlerimi değiştirmez mi?

Bir diziye json dizesi yapmak için json_decode işlevini kullanmaya çalışıyorum. JSON, başka bir yerde bir REST API'sından geliyor, bu yüzden JSON dizesinin biçimlendirilmesi üzerinde hiçbir kontrolüm yok.

[{ 
    "webinarKey":795855906, 
    "sessionKey":100000000041808257, 
    "startTime":"2011-12-16T13:56:15Z", 
    "endTime":"2011-12-16T14:48:37Z", 
    "registrantsAttended":2 
}] 

Burada sessionKey değerden sonra özellikle değilim: İşte kullanmaya çalışıyorum json dizeleri birinin bir örnektir. PHP değeri float olarak değerlendiriyor ve orijinal değeri almak için hiçbir şey yapamam gibi görünüyor.

json_decode($json, true, 512, JSON_BIGINT_AS_STRING); 
# This produces the following error because my php version isn't up to snuff and I 
# can't upgrade to the version required 
# Warning: json_decode() expects at most 2 parameters, 4 given 

Ben de bu denedim:

Aşağıdaki denedim Dediğim gibi 5.4 php yükseltme,

$json_obj = json_decode($json, true); 
number_format($json_obj[0]["sessionKey"], 0, '.', ''); 
# This results in precision issues where the value was 100000000041808257 
# but is number_formated out as 100000000041808256 

(4 parametre json_decode çağrı desteklendiği) bir seçenek değil. Lütfen yardım et!

Teşekkürler!

+0

Burada bir yerde bir kopyası var sanırım, –

+1

aramaya değer olabilir Bu soruya bakabilirsiniz. JSON'un iade edilmesinden önce ancak çözümlenmeden önce birkaç kişi çözüm önerdi. http://stackoverflow.com/q/2907806/2863 –

cevap

3

Teşekkürler @Scott Gottreu ve @pospi.

Yanıt, this question adresinde kabul edilen yanıtın son yorumunu yaptı.

Tüm tamsayı değerlerini tırnak içine almak için preg_replace() işlevini kullanın.

:

json_decode(preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString), true); 

Aslında değerler böylece sorunu gidermek için olarak kayan nokta sayıları ile JSON yukarıdaki çizgisi vidaları kadar test ettikten sonra ben sadece tırnak tüm numaraları (tamsayı veya kayan noktalı sayılar) çevrelemek için aşağıdaki kullanılır kalite JSON spec kullanım için

json_decode(preg_replace('/("\w+"):(\d+(\.\d+)?)/', '\\1:"\\2"', $jsonString), true); 
+2

Negatif sayılarla uğraşmanız durumunda, '-' sembolünü regexp'de isteğe bağlı olarak ekleyin: ' $ json = preg_replace ('/ ("\ w + "): (-? \ d + (\. \ d +)?)/',' \\ 1:" \\ 2 "', $ json)' – joserobleda

7

:

// wrap numbers 
$json = preg_replace('/:\s*(\-?\d+(\.\d+)?([e|E][\-|\+]\d+)?)/', ': "$1"', $json); 
// as object 
$object = json_decode($json); 
// as array 
$array = json_decode($json, true); 
+0

bu benim için çalışan tek şeydi +1 –

+2

Bunu alışkanlık Colonlar ve sayılar içeren dizeleri içeren bozuk json? – Phil

+0

Phil_1984_ evet Sanırım haklısınız. Özellikle, bir kolon ve bir json tamsayı ile bir dize için olurdu. Sanırım bir dize ama özellik olmamasını garanti etmek için kolondan önce kaçmayan bir çift alıntı olup olmadığını kontrol etmelisiniz. –

2

arada, PHP nasılsa, iyi ... Bu sorun düzeltilmiştir. PHP 5.4 civarında bir tarihten itibaren onlar bir seçeneği eklendi hemen üstünde yayınlanmıştır Regex çözümler ne:

json_decode($json, false, 512, JSON_BIGINT_AS_STRING); 

512 varsayılan maksimum yuvalanma derinliği ifade eder.

İlgili konular