PHP в формате JSON кодирования кодирование чисел в виде строк



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



array('id' => 3)


становится



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


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

461   17  

17 ответов:

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

$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) вот, это правильно форматирует его как число. Это позволяет вам контролировать, что является и не является числом, поступающим из вашей базы данных.

EDIT:

The 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+)\"/", '', $json );

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

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

попробовать $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

следующий тест подтверждает, что изменение типа на string приводит к тому, что 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>";

?>

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

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

страницы руководства как "mysql_fetch_array":

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

... и " mysql_ fetch_ row":

возвращает числовое значение массив строк что соответствует выбранному строки

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

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

не понимая этого, я также нашел этот вопрос и понял проблему! :)

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

Так Паскаль Мартин не получает достаточно кредита. Проверка числовых значений на каждом возврате JSON невозможна для существующего проекта с сотнями серверных функций.

Я заменил php-mysql на php-mysqlnd,и проблема ушла. Числа-числа, строки, строки, логические значения являются логическими.

У меня также была такая же проблема с обработкой данных из базы данных. В основном проблема заключается в том, что тип в массиве для преобразования в 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), если возникает какая-либо проблема!! Он будет работать нормально.

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

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

parseFloat('122.5'); // returns 122.5
parseInt('22'); // returns 22
parseInt('22.5'); // returns 22

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

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

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

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

надеюсь, что это поможет кому-то

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

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

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

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

Comments

    Ничего не найдено.