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

Другие вопросы по тегам