データベースからビューにデータを返す 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 データが表示されます。
EDIT 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 データを直接返すページを呼び出すと、空の配列の結果として [] が返されます。