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

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

array('id' => 3)

становится

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

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

Ответ 1

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

$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 может вас заинтересовать, btw?

Ответ 2

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

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

Ответ 3

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

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

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

EDIT:

Функция 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}

Ответ 4

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

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

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

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

Ответ 6

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

?>

Ответ 7

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

Ответ 8

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

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

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

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

... и строка mysql_ fetch_:

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

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

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

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

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

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

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

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

Ответ 13

$rows = array();
while($r = mysql_fetch_assoc($result)) {
    $r["id"] = intval($r["id"]); 
    $rows[] = $r;
}
print json_encode($rows);  

Ответ 14

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

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

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

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

Надеюсь, что кто-то поможет

Ответ 15

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

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

Ответ 16

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

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