json_encode создает искаженные данные JSON?
У меня есть приложение codeigniter, которое возвращает некоторые данные из моей базы данных в представление. Я пытаюсь отправить его обратно как данные JSON.
Проблема в том, что возвращаемые данные искажены. это выглядит так:
({'2.5':"Admin1", '2.10':"Admin2"})
Когда я проверяю это на jsonlint.com, это показывает, что это не действительно json. '2.5' должно быть в двойных кавычках, а не в одинарных. Чего я не понимаю, так это того, что я вызываю json_encode для своих данных, прежде чем передать их в представление. Мой код в моем контроллере выглядит так:
public function getbuildings()
{
$buildings = array();
$branchID = $this->uri->segment(3);
$buildingforbranch = array();
$_locations = $this->racktables_model->get_locations();
//print_r($_locations);
foreach ($_locations as $location)
{
if ((isset($location['L2FullID'])) && (!array_key_exists($location['L2FullID'],$buildings))) {
$buildings[$location['L2FullID']] = $location['L2Location'];
}
}
foreach ($buildings as $key => $value)
{
$pattern = "/(".$branchID."\.\d)/i";
if (preg_match($pattern,$key))
{
$buildingforbranch[(string)$key] = $value;
}
}
header ('Content-Type: application/json; charset=UTF-8');
echo json_encode($buildingforbranch);
}
Как видно из кода, я даже пытался явно привести $key к строковому типу данных. Но это, похоже, ничего не меняет. Какие-либо предложения? Благодарю.
РЕДАКТИРОВАТЬ 1
Когда я выполняю дамп var на $buildingforbranch прямо перед вызовом header / json_encode(), я получаю следующие результаты:
array(3) {
["2.5"]=>
string(7) "Admin 2"
["2.10"]=>
string(7) "Admin 1"
["2.11"]=>
string(3) "SB4"
}
Здесь это выглядит хорошо... но когда я выполняю console.log() и передаю данные из контроллера, браузер показывает неправильно сформированные данные json.
РЕДАКТИРОВАТЬ 2 Вот то, что я пытаюсь сделать. Мне нужно динамически создать поле со списком, когда пользователь нажимает на элемент управления на моей странице. Если вызов ajax приводит к пустому массиву, я не хочу отображать комбо. В противном случае я пытаюсь заполнить поле со списком результатами вызова ajax. Все работает, кроме той части, где я пытаюсь проверить длину данных json. Мое приложение всегда отображает поле со списком независимо от того, что отправлено обратно.
Вот код:
$.ajax({
url:"<?php echo site_url('switches/getbuildings/');?>" + "/" + $selectedvalue,
type:'GET',
dataType:'json',
success: function(returnDataFromController) {
console.log("getbuildings ajax call successfull");
var htmlstring;
htmlstring="<select name='L2Locations' id='L2Locations'>";
htmlstring = htmlstring + "<option value='all'>All</option>";
//console.log(returnDataFromController);
var JSONdata=[returnDataFromController];
console.log(JSONdata);
if (JSONdata.length != 0)
{
for(var i=0;i<JSONdata.length;i++){
var obj = JSONdata[i];
for(var key in obj){
var locationkey = key;
var locationname = obj[key];
htmlstring = htmlstring + "<option value='" + locationkey + "'>" + locationname + "</option>";
} //end inner for
$('#l2locations').html(htmlstring);
}//end outer for
}
else {
//alert('i think undefined');
$('#l2locations').html('');
}
}//success
});//end ajax
Если я вызываю страницу, которая возвращает данные json напрямую, я получаю [] в качестве результата для пустого массива.
3 ответа
[] фактически определяет массив с единственным элементом в вашем конкретном случае. Но, как я вижу, вы используете JQuery AJAX с dataType: "json"
, это означает, что возвращаемое значение уже является объектом, вам не нужно анализировать его еще раз, поэтому просто удалите []:
var JSONdata=returnDataFromController; // instead of var JSONdata=[returnDataFromController];
Как указано в вашем другом вопросе, вам нужно обрабатывать JSON как JSON.
Основной обзор:
returnDataFromController
будет строка, используйтеJSON.parse()
или parseJson() jQuery для преобразования его в объект JSON- Перепишите свой цикл, который генерирует опции для перебора объекта JSON, а не массива. Обратите внимание, что jquery.each() может обрабатывать как массивы, так и объекты . , ,
Настоящим ключом здесь является сохранение типов данных прямо. Вы получаете строку назад, которая содержит данные JSON. Нет простого способа преобразовать это в массив, поэтому читайте его как JSON. Поскольку теперь это объект JSON, вы должны рассматривать его как объект JSON, а не как массив.
Проверьте категорию jQuery Utilities на предмет других связанных с JSON элементов.
Используйте Firebug на Firefox, чтобы увидеть, что отображается на вкладке "ответ" на вкладке "сеть"
Этот код
<?php
echo json_encode(array(
"2.5" => "Admin 2",
"2.10" => "Admin 1",
"2.11" => "SB4"
));
производит этот вывод {"2.5":"Admin 2","2.10":"Admin 1","2.11":"SB4"}
на моем сервере (php5.3) и на этом примере скрипки http://www.phpfiddle.org/main/code/xqy-ize