PHP кодировки json_encode в виде строк

У меня возникла одна проблема с функцией PHP json_encode. Он кодирует числа как строки, например

array('id' => 3) 

становится

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

Когда js встречает эти значения, он интерпретирует их как строки, а числовые операции терпят неудачу на них. Кто-нибудь знает, как предотвратить json_encode от кодирования чисел в виде строк? Спасибо!

Я сделал очень быстрый тест:

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

Кажется, это похоже на то, что вы описываете, если я не ошибаюсь?

И я получаю вывод:

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

Итак, в этом случае целые числа не были преобразованы в строку.

Тем не менее, это может зависеть от версии PHP, которую мы используем: было исправлено несколько ошибок, связанных с json_encode, в зависимости от версии PHP …

Этот тест был проведен с помощью PHP 5.2.6; Я получаю то же самое с PHP 5.2.9 и 5.3.0; У меня нет другой версии 5.2.x для тестирования, хотя 🙁

Какую версию PHP вы используете? Или ваш тестовый сценарий сложнее, чем пример, который вы опубликовали?

Может быть, может быть связано с одним сообщением об ошибке на http://bugs.php.net/ ? Например, ошибка № 40503: преобразование целочисленного json_encode несовместимо с PHP ?

Может быть, ошибка № 38680 может вас заинтересовать, кстати?

Обратите внимание, что с PHP 5.3.3 есть флаг для автоматического преобразования чисел (параметр options был добавлен в PHP 5.3.0):

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

Я также читал из БД (PostgreSQL), и все было строкой. Мы перебираем каждую строку и делаем что-то с ней для создания нашего окончательного массива результатов, поэтому я использовал

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

в цикле, чтобы заставить его быть целочисленным значением. Когда я делаю json_encode($result_arr) сейчас, он правильно форматирует его как число. Это позволяет вам контролировать то, что есть и не является числом, поступающим из вашей базы данных.

РЕДАКТИРОВАТЬ:

Функция json_encode() также имеет возможность сделать это «на лету», используя флаг JSON_NUMERIC_CHECK в качестве второго аргумента. Вы должны быть осторожны, используя это, как показано в этом примере пользователей в документации (скопировано ниже): http://uk3.php.net/manual/en/function.json-encode.php#106641

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

И тогда вы получите этот JSON:

 {"phone_number":33123456789} 

Я сталкиваюсь с той же проблемой (PHP-5.2.11 / Windows). Я использую это обходное решение

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

который заменяет все (неотрицательные, целочисленные) числа, заключенные в кавычки с самим номером («42» 'становится «42»).

См. Также этот комментарий в руководстве по PHP .

попробуйте $arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);
$arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);

Но он просто работает на PHP 5.3.3. Посмотрите этот журнал изменений PHP json_encode http://php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog

Следующий тест подтверждает, что изменение типа на строку приводит к тому, что json_encode () возвращает числовую строку как строку JSON (т. Е. Окружен двойными кавычками). Используйте settype (arr ["var"], "integer") или settype ($ arr ["var"], "float"), чтобы исправить это.

 <?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>"; ?> 

У меня также были те же проблемы обработки данных из базы данных. В основном проблема заключается в том, что тип в массиве для преобразования в json, распознается PHP как строка, а не как целое. В моем случае я сделал запрос, который возвращает данные из строки подсчета столбцов базы данных. Драйвер PDO не распознает столбец как int, а как строки. Я решил, выполнив литье как int в затронутом столбце.

Ради полноты (как я еще не могу добавить комментарии), позвольте мне также добавить эту деталь в качестве другого ответа:

(Edit: читать после того, как поняли, что исходные данные (то есть в случае OP, набор результатов базы данных) могут быть проблемой (путем возврата числовых столбцов в виде строк), а json_encode () на самом деле не является источником проблемы)

Ручные страницы обоих « mysql_fetch_array »:

Возвращает массив строк , соответствующий выбранной строке,

… и " mysql_ fetch_ row ":

Возвращает числовой массив строк , соответствующий выбранной строке.

ясно заявляет, что; записи в возвращаемом массиве будут строками.

(Я использовал класс DB в phpBB2 (да, я знаю, он устарел!), А метод sql_fetchrow () этого класса использует «mysql_fetch_array ()»)

Не осознавая этого, я тоже нашел этот вопрос и понял проблему! 🙂

Как сказал Паскаль Мартин в своих последующих комментариях, я считаю, что решение, которое заботится о проблеме «неправильного типа» у источника (т. Е. С помощью функции « mysql_field_type () » и выполняет литье сразу после извлечения (или другие методы выборки, такие как «объект»?)), были бы лучше в целом.

это версия php, проблема в том же выпуске обновила мою версию php до 5.6.

Кажется, что исправление значений для int или float исправить. Например:

 $coordinates => array( (float) $ap->latitude, (float) $ap->longitude ); 

Вы можете использовать (int), если возникнет какая-либо проблема! Он будет работать нормально.

Ну, PHP json_encode () возвращает строку.

Вы можете использовать parseFloat () или parseInt () в js-коде, хотя:

 parseFloat('122.5'); // returns 122.5 parseInt('22'); // returns 22 parseInt('22.5'); // returns 22 
 $rows = array(); while($r = mysql_fetch_assoc($result)) { $r["id"] = intval($r["id"]); $rows[] = $r; } print json_encode($rows); 

Просто выполните ту же проблему, и база данных вернула значения в виде строк.

Я использую это как обходной путь:

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

Это умножает значение на 1, чтобы направить его в число

Надежда, которая помогает кому-то

json_encode сериализует некоторую структуру данных в формате JSON для отправки по сети. Поэтому все содержимое будет содержать строку типа. Также, когда вы получаете некоторый параметр от $ _POST или $ _GET.

Если вам нужно сделать числовые операции над переданными значениями, просто сначала преобразуйте их в int (с помощью функции intval () в PHP или parseInt () в Javascript), а затем выполните операции.

Как сказал oli_arborum, я думаю, вы можете использовать preg_replace для выполнения задания. Просто измените команду следующим образом:

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