【问题标题】:json_encode creating malformed JSON data?json_encode 创建格式错误的 JSON 数据?
【发布时间】: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

标签: php jquery ajax


【解决方案1】:

[] 实际上在您的特定情况下定义了一个具有单个元素的数组。但是正如我看到的,您正在使用带有dataType: "json" 的jQuery ajax,这意味着返回的值已经是一个对象,您不需要再次解析它,所以只需删除[]:

var JSONdata=returnDataFromController; // instead of var JSONdata=[returnDataFromController];

【讨论】:

  • 当我删除它时,根本不会创建组合框,即使对于控制器返回数据的调用也是如此。 (顺便说一句,console.log 仍然在键值周围显示单引号而不是双引号)。
  • @dot console.log(typeof(returnDataFromController)) 的结果是什么?
【解决方案2】:

正如您的other question 中所述,您需要将 JSON 处理为 JSON。

基本概述是:

  • returnDataFromController 将是一个字符串,使用 JSON.parse()jQuery's parseJson() 将其转换为 JSON 对象
  • 重写您的循环,生成用于迭代 JSON 对象而不是数组的选项。请注意,jquery.each() 可以同时处理数组,而对象将处理 这似乎是您缺少的部分。 . .

这里真正的关键是保持数据类型的正确性。你得到一个字符串,其中包含 JSON 数据。没有简单的方法将其转换为数组,因此将其作为 JSON 读取。由于它现在是 JSON 对象,因此您必须将其视为 JSON 对象,而不是数组。

查看jQuery Utilities 类别以获取其他与 JSON 相关的项目。

【讨论】:

    【解决方案3】:

    在 firefox 上使用 firebug 查看“net”选项卡上的“response”选项卡中显示的内容
    这段代码

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

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 2023-04-09
      • 1970-01-01
      • 2018-05-21
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多