Mam jeden problem z funkcją json_encode PHP. Koduje liczby jako ciągi znaków, np
array('id' => 3)
staje się
"{ ["id": "3", ...)
Gdy js napotyka te wartości, interpretuje je jako łańcuchy i operacje numeryczne kończą się niepowodzeniem. Czy ktoś zna sposób, aby zapobiec json_encode
kodowaniu liczb jako ciągów znaków? Dziękuję Ci!
php
javascript
json
Chris Barnhill
źródło
źródło
Odpowiedzi:
Zrobiłem bardzo szybki test:
To wygląda na to, co opisujesz, jeśli się nie mylę?
I otrzymuję jako wyjście:
Zatem w tym przypadku liczby całkowite nie zostały przekonwertowane na łańcuch.
Jednak może to zależeć od używanej wersji PHP: poprawiono kilka błędów związanych z json_encode, w zależności od wersji PHP ...
Ten test został wykonany w PHP 5.2.6; Otrzymuję to samo z PHP 5.2.9 i 5.3.0; Nie mam jednak innej wersji 5.2.x do przetestowania :-(
Której wersji PHP używasz? A może Twój przypadek testowy jest bardziej złożony niż przykład, który opublikowałeś?
Może jeden raport o błędzie na http://bugs.php.net/ mógłby być powiązany? Na przykład błąd nr 40503: konwersja liczb całkowitych json_encode jest niezgodna z PHP ?
Może Bug # 38680 też może Cię zainteresować?
źródło
Zauważ, że od PHP 5.3.3 istnieje flaga do automatycznej konwersji liczb (parametr opcji został dodany w PHP 5.3.0):
źródło
JSON_NUMERIC_CHECK
próbuje automatycznie zgadnąć, czy ciąg jest liczbą, czy nie, próbując go przeanalizować. Jeśli się nad tym zastanowić, jest to dość niewiarygodne. Przekształci wszystkie właściwości wyglądające liczbowo na liczby (nie tylko te, które chcesz) i zrobi to tylko wtedy, gdy będą wyglądać jak liczby. To przynajmniej chwiejne, jeśli nie niebezpieczne. Kod, który używa utworzonego kodu JSON, może polegać na typie będącym jednym lub drugim. Dziwne rzeczy mogą się wydarzyć, jeśli te oczekiwania nie zostaną spełnione. Jeśli zależy Ci na dobrych praktykach i bezpieczeństwie, powinieneś selektywnie konwertować wartości, które chcesz.Ja również czytałem z bazy danych (PostgreSQL) i wszystko było ciągiem znaków. Zapętlamy każdy wiersz i robimy z nim różne rzeczy, aby zbudować naszą ostateczną tablicę wyników, więc użyłem
w pętli, aby wymusić na niej wartość całkowitą. Kiedy
json_encode($result_arr)
teraz to zrobię , poprawnie formatuje go jako liczbę. Pozwala to kontrolować, co jest, a co nie jest numerem pochodzącym z Twojej bazy danych.EDYTOWAĆ:
json_encode()
Funkcja ma również możliwość, aby to zrobić w locie przy użyciuJSON_NUMERIC_CHECK
flagi jako drugi argument do niego. Musisz jednak uważać, używając go, jak pokazano na tym przykładzie użytkownika w dokumentacji (skopiowanej poniżej): http://uk3.php.net/manual/en/function.json-encode.php#106641A potem otrzymujesz ten JSON:
źródło
json_encode
funkcji. jest to najbardziej poprawna odpowiedź, ale bądź ostrożny, ponieważJSON_NUMERIC_CHECK
konwertuje również numery telefonów i inne wartości liczbowe ciągów, co może powodować problemy z początkowymi zerami lub „+” ... Proponuję rozwiązać ten problem w funkcji odczytu bazy danych.próbować
$arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);
Ale działa tylko na PHP 5.3.3. Spójrz na ten dziennik zmian json_encode PHP http://php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog
źródło
Mam ten sam problem (PHP-5.2.11 / Windows). Używam tego obejścia
która zastępuje wszystkie (nieujemne, całkowite) liczby ujęte w cudzysłowy samą liczbą („42” staje się „42”).
Zobacz także ten komentarz w podręczniku PHP .
źródło
$json_array = json_encode($some_array, false);
Zatem fałszywy argument mówi PHP, aby nie wykonywał konwersji obiektów.json_encode(array(-1=>'que', '0'=>'-1'))
$this->data = preg_replace("/\" *?: *?(\d+)/", '":"$1"', $this->data);
Poniższy test potwierdza, że zmiana typu na ciąg powoduje, że json_encode () zwraca wartość liczbową jako ciąg JSON (tj. Ujęty w podwójne cudzysłowy). Użyj settype (arr ["var"], "integer") lub settype ($ arr ["var"], "float"), aby to naprawić.
źródło
Ze względu na kompletność (ponieważ nie mogę jeszcze dodawać komentarzy), dodam również ten szczegół jako kolejną odpowiedź:
Edytuj
Strony podręcznika dla obu „ mysql_fetch_array ”:
... i „ mysql_ fetch_ row ”:
jasno to stwierdza; wpisy w zwróconej tablicy będą ciągami.
(Używałem klasy DB w phpBB2 (tak wiem, jest przestarzała!), A metoda „sql_fetchrow ()” tej klasy używa „mysql_fetch_array ()”)
Nie zdając sobie z tego sprawy, w końcu znalazłem to pytanie i zrozumiałem problem! :)
Jak Pascal Martin stwierdził powyżej w swoich komentarzach uzupełniających, uważam, że rozwiązanie, które rozwiązuje problem „nieprawidłowego typu” u źródła (tj. Używając funkcji „ mysql_field_type () ” i wykonując rzutowanie zaraz po pobraniu (lub inne metody pobierania, takie jak „obiekt”?)) byłyby ogólnie lepsze.
źródło
Więc Pascal MARTIN nie ma tutaj wystarczających kredytów. Sprawdzanie wartości liczbowych w każdym zwrocie JSON jest niewykonalne w przypadku istniejącego projektu z setkami funkcji po stronie serwera.
Zastąpiłem php-mysql php-mysqlnd i problem zniknął. Liczby to liczby, łańcuchy to łańcuchy, wartości logiczne to wartości logiczne.
źródło
Miałem też ten sam problem z przetwarzaniem danych z bazy danych. Zasadniczo problem polega na tym, że typ w tablicy do konwersji w json jest rozpoznawany przez PHP jako ciąg znaków, a nie jako liczba całkowita. W moim przypadku wykonałem zapytanie, które zwraca dane z wiersza liczącego kolumny DB. Sterownik PDO nie rozpoznaje kolumny jako int, ale jako ciągi. Rozwiązałem, wykonując rzutowanie jako int w odpowiedniej kolumnie.
źródło
źródło
to jest wersja php problem, ten sam problem, który zaktualizował moją wersję php do 5.6, rozwiązał problem
źródło
Rzutowanie wartości na int lub float wydaje się to naprawiać. Na przykład:
źródło
Możesz użyć (int), jeśli wystąpi jakikolwiek problem !! Będzie działać dobrze.
źródło
Po prostu napotkałem ten sam problem i baza danych zwracała wartości jako ciągi.
Używam tego jako obejścia:
Oznacza to pomnożenie wartości przez 1, aby rzucić ją na liczbę
Mam nadzieję, że to komuś pomoże
źródło
json_encode serializuje niektóre struktury danych w formacie JSON do wysłania przez sieć. Dlatego cała zawartość będzie typu string. Tak jak w przypadku otrzymania jakiegoś parametru z $ _POST lub $ _GET.
Jeśli musisz wykonać operacje numeryczne na wysłanych wartościach, po prostu najpierw przekonwertuj je na int (za pomocą funkcji intval () w PHP lub parseInt () w JavaScript), a następnie wykonaj te operacje.
źródło
Cóż, PHP json_encode () zwraca ciąg.
Możesz jednak użyć parseFloat () lub parseInt () w kodzie js:
źródło
Jak powiedział oli_arborum, myślę, że możesz użyć
preg_replace
do wykonania tej pracy. Po prostu zmień polecenie w ten sposób:źródło