3

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

4

3 に答える 3

0

[]は、実際には、特定の場合に単一の要素を持つ配列を定義します。しかし、jQuery ajaxをで使用していることがわかりますdataType: "json"。これは、戻り値がすでにオブジェクトであることを意味します。もう一度解析する必要はないので、[]を削除するだけです。

var JSONdata=returnDataFromController; // instead of var JSONdata=[returnDataFromController];
于 2012-09-19T19:50:35.367 に答える
0

firefox で firebug を使用して、「net」タブの「response」タブに表示される内容を確認します
このコード

<?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

于 2012-09-20T19:45:49.573 に答える
0

他の質問で述べたように、JSON を JSON として処理する必要があります。

基本的な概要は次のとおりです。

  • returnDataFromController文字列になります。JSON オブジェクトに変換するには、JSON.parse()またはjQuery の parseJson()を使用します
  • オプションを生成するループを書き直して、配列ではなく JSON オブジェクトを反復処理します。jquery.each()は配列とオブジェクトの両方を処理できることに注意してください。これは、欠落している部分のようです。. .

ここで重要なのは、データ型をまっすぐに保つことです。JSON データを含む文字列が返されます。これを配列に変換する簡単な方法はないため、JSON として読み込みます。これは JSON オブジェクトになったため、配列ではなく JSON オブジェクトとして扱う必要があります。

その他の JSON 関連項目については、 jQuery ユーティリティカテゴリを確認してください。

于 2012-09-20T19:17:19.473 に答える