我有一个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
当我在header / json_encode()调用之前在$ buildingforbranch上执行var转储时,我得到以下结果:
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数据的页面,我得到[]作为空数组的结果。
答案 0 :(得分:0)
[]实际上是在您的特定情况下定义一个包含单个元素的数组。但是当我看到你正在使用带有dataType: "json"
的jQuery ajax时,这意味着返回的值已经是一个对象,你不需要再次解析它,所以只需删除[]:
var JSONdata=returnDataFromController; // instead of var JSONdata=[returnDataFromController];
答案 1 :(得分:0)
如您other question中所述,您需要将JSON作为JSON处理。
基本概述是:
returnDataFromController
将是一个字符串,使用JSON.parse()
或jQuery's parseJson()将其转换为JSON对象这里的真正关键是保持数据类型直接。你得到一个包含JSON数据的字符串。没有简单的方法将其转换为数组,因此请将其作为JSON读取。由于它现在是一个JSON对象,您必须将其视为JSON对象,而不是数组。
检查jQuery Utilities类别以了解其他与JSON相关的项目。
答案 2 :(得分:0)
在firefox上使用firebug,查看“网络”标签上“响应”标签中显示的内容 这段代码
<?php
echo json_encode(array(
"2.5" => "Admin 2",
"2.10" => "Admin 1",
"2.11" => "SB4"
));
在我的服务器(php5.3)和这个小提琴示例上生成此输出{"2.5":"Admin 2","2.10":"Admin 1","2.11":"SB4"}
http://www.phpfiddle.org/main/code/xqy-ize