У меня есть PHP-скрипт, который выводит данные JSON, которые анализируются Javascript в браузерах, а также приложениями для iPhone и Android.
Раньше я обнаружил, что когда PHP преобразует данные массива в JSON, он превращает все числовые значения в строки, как указано двойными кавычками. Так, например, "id" : 1
станет "id" : "1"
. Это, похоже, путало некоторые из функций Javascript, которые получали данные JSON, поэтому я запустил это регулярное выражение на JSON в PHP, чтобы убедиться, что числа не были записаны в строки:
$JSONOutput = preg_replace('/"(-?\d+\.?\d*)"/', '$1', json_encode($JSONOutput));
Однако это также приводит к удалению двойных кавычек из обоих ключей и значений, поэтому 1 : "first value"
становится "1" : "first value"
. Оказывается, это проблема, потому что если ключи JSON не являются строками, то приложение iPhone, которое получает данные, жалуется.
Итак, что я хочу сделать, убедитесь, что все значения в JSON сохранены как целые числа, но все ключи сделаны в строки. Есть ли способ, которым я могу запустить регулярное выражение, которое у меня выше, только для значений? Или любой другой процесс, который дал бы мне аналогичный результат?
Есть ли способ, которым я могу запустить регулярное выражение, которое у меня выше, только для значений?
Вы намного лучше избегаете пост-обработки строки.
Раньше я обнаружил, что когда PHP преобразует данные массива в JSON, он превращает все числовые значения в строки, как указано двойными кавычками. Так, например, «id»: 1 станет «id»: «1».
Ответ здесь – убедиться, что числовые значения действительно являются числами. Если вы видите строки с цифрами в них, где вы ожидаете числа, это потому, что значение в объекте / массиве PHP не является числом. Это то, что вам нужно исправить.
Например, этот код:
<?php header('Content-Type: application/json'); $x = array( "number" => 1, "string" => "2" ); echo json_encode($x); ?>
… вполне корректно производит этот вывод:
{"number":1,"string":"2"}
Обратите внимание, как значение, которое действительно является номером в коде PHP, выдается как число в JSON.
Поэтому вместо того, чтобы обрабатывать строку, ответ должен исправить данные, которые вы json_encode
в json_encode
.
Отвечая на ваш комментарий ниже:
Я понимаю, что я мог бы специально назначать имена строк для ключей, но соответствующий массив генерируется автоматически с циклом while, который сохраняет число добавлений, и эти числа используются в операциях подсчета, поэтому я не думаю, что это сработает в моем случае ,
Это не имеет никакого значения. Например, этот код:
<?php header('Content-Type: application/json'); $x = array(); for ($n = 1; $n < 5; ++$n) { $x["entry" . $n] = $n; } echo json_encode($x); ?>
производит этот вывод:
{"entry1":1,"entry2":2,"entry3":3,"entry4":4}
Снова обратите внимание, что цифры – это числа на входе и, следовательно, числа на выходе.
Также обратите внимание, что PHP правильно обрабатывает его, если ключи объекта являются числами:
<?php header('Content-Type: application/json'); $x = array(); $x["foo"] = "bar"; for ($n = 1; $n < 5; ++$n) { $x[$n] = $n * 2; } echo json_encode($x); ?>
производит
{"foo":"bar","1":2,"2":4,"3":6,"4":8}