У меня одна проблема с функцией PHP json_encode. Он кодирует числа как строки, например
array('id' => 3)
становится
"{ ["id": "3", ...)
Когда js встречает эти значения, он интерпретирует их как строки, и числовые операции с ними не выполняются. Кто-нибудь знает, как предотвратить json_encode
кодирование чисел в виде строк? Спасибо!
php
javascript
json
Крис Барнхилл
источник
источник
Ответы:
Я сделал очень быстрый тест:
$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"}
источник
JSON_NUMERIC_CHECK
пытается автоматически угадать, является ли строка числом или нет, пытаясь разобрать ее. Если задуматься, это довольно ненадежно. Он преобразует все числовые свойства в числа (а не только те, которые вам нужны), и будет делать это, только если они выглядят как числа. Это, по крайней мере, ненадежно, если не небезопасно. Код, который использует созданный JSON, может полагаться на тот или иной тип. Если эти ожидания не оправдаются, могут случиться странные вещи. Если вы заботитесь о передовых методах работы и безопасности, вам следует выборочно преобразовывать нужные вам значения.Я тоже читал из БД (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}
источник
json_encode
функции. это наиболее правильный ответ, но будьте осторожны, поскольку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
источник
У меня такая же проблема (PHP-5.2.11 / Windows). Я использую этот обходной путь
$json = preg_replace( "/\"(\d+)\"/", '$1', $json );
который заменяет все (неотрицательные, целые) числа, заключенные в кавычки, самим числом («42» становится «42»).
См. Также этот комментарий в руководстве по PHP .
источник
$json_array = json_encode($some_array, false);
Таким образом, аргумент false указывает PHP не выполнять преобразование объекта.json_encode(array(-1=>'que', '0'=>'-1'))
$this->data = preg_replace("/\" *?: *?(\d+)/", '":"$1"', $this->data);
Следующий тест подтверждает, что изменение типа на строку приводит к тому, что 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-mysql на php-mysqlnd, и проблема исчезла. Числа - это числа, строки - это строки, логические значения - это логические.
источник
Для полноты (поскольку я пока не могу добавлять комментарии) позвольте мне также добавить эту деталь в качестве еще одного ответа:
(Изменить: для чтения после осознания того, что исходные данные (т.е. в случае OP, набор результатов базы данных) могут быть проблемой (путем возврата числовых столбцов в виде строк), а json_encode () на самом деле не был источником проблемы)
Страницы руководства для " mysql_fetch_array ":
... и " mysql_ fetch_ row ":
четко заявляет, что; записи в возвращаемом массиве будут строками.
(Я использовал класс DB в phpBB2 (да, я знаю, он устарел!), А метод sql_fetchrow () этого класса использует mysql_fetch_array ())
Не осознавая этого, я тоже нашел этот вопрос и понял проблему! :)
Как Паскаль Мартин заявил выше в своих последующих комментариях, я считаю, что решение, которое решает проблему «неправильного типа» в источнике (то есть, используя функцию « mysql_field_type () » и выполняя приведение сразу после выборки, (или другие методы выборки, такие как "объект"?)) в целом были бы лучше.
источник
У меня тоже была такая же проблема с обработкой данных из базы данных. В основном проблема в том, что тип массива, который нужно преобразовать в json, распознается PHP как строка, а не как целое число. В моем случае я сделал запрос, который возвращает данные из строки подсчета столбцов БД. Драйвер PDO распознает столбец не как int, а как строки. Я решил, выполнив приведение к типу int в затронутом столбце.
источник
$rows = array(); while($r = mysql_fetch_assoc($result)) { $r["id"] = intval($r["id"]); $rows[] = $r; } print json_encode($rows);
источник
это проблема с версией php, если та же проблема обновила мою версию php до 5.6, проблема была решена
источник
Приведение значений к int или float, кажется, исправляет это. Например:
$coordinates => array( (float) $ap->latitude, (float) $ap->longitude );
источник
Вы можете использовать (int), если возникнут какие-либо проблемы !! Будет работать нормально.
источник
Просто столкнитесь с той же проблемой, и база данных возвращает значения в виде строк.
Я использую это как обходной путь:
$a = array( 'id' => $row['id'] * 1, 'another' => ..., 'ananother' => ..., ); $json = json_encode($a);
Это умножение значения на 1, чтобы преобразовать его в число
Надеюсь, это кому-то поможет
источник
json_encode сериализует некоторые структуры данных в формате JSON для отправки по сети. Следовательно, все содержимое будет иметь строковый тип. Так же, как когда вы получаете какой-то параметр от $ _POST или $ _GET.
Если вам нужно выполнить числовые операции с отправленными значениями, просто сначала преобразуйте их в int (с помощью функции intval () в PHP или parseInt () в Javascript), а затем выполните операции.
источник
Ну, PHP json_encode () возвращает строку.
Вы можете использовать parseFloat () или parseInt () в js-коде:
parseFloat('122.5'); // returns 122.5 parseInt('22'); // returns 22 parseInt('22.5'); // returns 22
источник
Как сказал oli_arborum, я думаю, вы можете использовать
preg_replace
для выполнения этой работы. Просто измените команду так:$json = preg_replace('#:"(\d+)"#', ':$1', $json);
источник