Как я могу гарантировать, что все ключевые имена в PHP, сгенерированном JSON, являются строками?

У меня есть 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}