【发布时间】:2012-09-19 18:39:17
【问题描述】:
我有一个 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
当我在标头 / 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 数据的页面,我会得到 [] 作为空数组的结果。
【问题讨论】:
-
如果在调用
json_encode之前将其丢弃,var_dump($buildingforbranch);会输出什么? -
@Sean,查看我帖子中的编辑#1。当我从 php 打印时,它似乎没问题。但是当我执行 console.log($datafromcontroller) 时,浏览器会显示格式错误的密钥。 ??
-
我不相信
console.log的输出。如果您使用浏览器直接导航到返回 JSON 的页面(即http://mysite.com/app/page-that-returns-json.php),具体内容是什么? -
它看起来是正确的。因此,如果我的数据没有格式错误......那么我无法弄清楚为什么我的代码无法正常工作。查看编辑编号 2.. 我会在稍后添加。
-
我无法重新创建数字周围有单引号的场景。不是
json_encode