2009-11-22 13 views
6

im napisałem usługę twitter mashup. Kiedy otrzymuję dane json, niektóre z twit id są większe niż (co jest maksymalną dozwoloną liczbą całkowitą na serwerach 32-bitowych).PHP json_decode na 32-bitowym serwerze

Wymyśliłem rozwiązanie, które działa, konwertując liczby całkowite do ciągów; w ten sposób funkcja json_decode() nie będzie miała żadnych problemów podczas próby wygenerowania tablicy.

To co muszę osiągnąć:

wcześniej (oryginalne dane JSON)

[{"name":"john","id":5932725006},{"name":"max","id":4953467146}] 

Po (rozwiązanie stosowane)

[{"name":"john","id":"5932725006"},{"name":"max","id":"4953467146"}] 

mam na myśli Implementacja preg_match, ale nie mam pojęcia, jak to zrobić kuloodporne. Każda pomoc będzie doceniana.

Odpowiedz

12

Można użyć preg_replace do przechwytywania numerów i dodać cytaty, coś takiego:

$jsonString = '[{"name":"john","id":5932725006},{"name":"max","id":4953467146}]'; 

echo preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString); 
//prints [{"name":"john","id":"5932725006"},{"name":"max","id":"4953467146"}] 

Spróbuj powyższy przykład here.

+2

Będziesz chciał "id": "w tym wyrażeniu, na pewno? W przeciwnym razie będzie pasować do dowolnej sekwencji liczb, poważnie łamiąc dowolny ciąg zawierający cyfrę. – bobince

+0

dokładnie. działa dobrze ... ale byłoby lepiej, gdyby pasował tylko do cyfr w pobliżu "id": – andufo

+0

@bobnice: Zgadzam się, edytowałem :) – CMS

1

Jeśli użyjesz PHP 5.2, te długie identyfikatory będą przetwarzane na wartości zmiennoprzecinkowe, które jednak nie są idealne, co najmniej daje ci 21 bitów dokładności całkowitej, co powinno z łatwością wystarczać do przechowywania tych identyfikatorów. (Oczywiście idealnym rozwiązaniem byłby serwer 64-bitowy.)

+0

serwer, na którym działa, ma zarówno środowiska php4, jak i php5. aby aktywować php5 muszę ustawić tę flagę w pliku .htaccess: Aplikacja AddType/x-httpd-php5 .php Może to dziwne ustawienie nie pozwoli mi uzyskać funkcji int2float. Dzięki za informacje. – andufo

+0

To powinno zadziałać, ale możesz, niestety, nadal uruchamiać starszą wersję PHP5. – bobince

0

Jeśli sprowadza się do tego, możesz spróbować użyć rozszerzenia PECL big_int. Dzięki temu PHP może używać liczb, które są wyjątkowo duże, jeśli zajdzie taka potrzeba. To duży skok, ale jeśli rutynowo zajmujesz się liczbami, które graniczą na granicy umysłu, prawdopodobnie uznasz to za pomocne.

Powiązane problemy