【问题标题】:SyntaxError: JSON.parse: unexpected character error in AJAX callSyntaxError:JSON.parse:AJAX 调用中出现意外字符错误
【发布时间】:2016-02-19 12:01:44
【问题描述】:

我是一家软件公司的工程实习生,我目前的项目是创建一个使用 AJAX 和 PHP 从数据库中获取数据的 HTML 页面。我以前从未在这个网站上发过帖子,我一直在寻找类似的帖子并使用我找到的信息。在过去的两个小时左右,我一直在寻找解决问题的方法。我的 AJAX 调用返回错误:“SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data.”

我尝试了很多东西,即:

  1. 将 dataType: 'json' 添加到 $.ajax 中的选项。
  2. 添加标头("Content-type: application/json");到 PHP 代码。
  3. 在成功函数中使用 console.log($.parseJSON(data))。
  4. 在 PHP 中重新格式化我的代码以包含引号或不将它们包含在数组中

问题似乎在于我的页面从我的 PHP 脚本接收到的数据的格式,如下所示:

header('Content-type: application/json');
$testarray = array("Name" => 'America', "Code" => '12345');
echo json_encode($testarray);

在我的 jquery 段中,我想从我的 PHP 脚本(最终将使用 MySQL 数据库)中检索 JSON 数据,并将数据作为元素添加到我的列表框国家列表中。我的 AJAX 调用如下:

$.ajax({
     cache: false,
     url: 'results.php',
     method: 'POST',
     dataType: 'json',
     data: "",
     success: function (data, textStatus, jqXHR){
           //I get an error with the following line
           var jsonData = JSON.parse(data);
           $(jsonData).each(function (i, element)
           {
                 var htmlSelect = document.getElementById("CountriesList");
                 var opt = document.createElement("option");
                 opt.text = element.Name;
                 opt.value = element.Code;
                 htmlSelect.options.add(opt);
            });
            },
            error: function(jsXHR, textStatus, errorThrown)
            {
                        alert('Error: ' + errorThrown)
            }
             });

此代码中可能存在其他错误,因为我无法通过此格式问题进行调试。当我自己打开 PHP 脚本时,我得到这个响应:{"Name":"America","Code":"12345"}。据我所知,其中的 JSON 格式正确。

我很茫然。任何帮助表示赞赏。

【问题讨论】:

  • 是响应不是json我认为你不需要解析它。试试 console.log(JSON.stringify(data));如果输出的是 JSON 字符串,你已经得到了 JSON

标签: javascript php jquery json ajax


【解决方案1】:

我把这个作为答案。

正如我在评论中所说,数据变量已经是一个 JSON 对象。所以你应该能够像这样访问每个元素:

for(var i in data){
    if(data.hasOwnProperty(i){
        $('#CountriesList').append($("<option></option>").attr("value",data[i].Value).text(data[i].Name));
    }
}

您的测试数组只是一个关联数组,而 javascript 需要一个关联数组的数组。试试

$testarray = array();
$testarray[] = array('Name'=>'America', 'Value'=>'12345');
$testarray[] = array('Name'=>'Europe', 'Value'=>'54321');

【讨论】:

  • 感谢您的帮助!我试着把它放进去,我的新成功函数只包含你的代码。但它仍然给了我完全相同的错误。
  • 我尝试注释掉 dataType: 'json',它没有给我语法错误,但现在您的代码返回“未定义”。
  • @ChristieFrieg 这可能是因为您的测试数组实际上是一个关联数组,请尝试将 php 更改为 $testarray = array(array("Name" => 'America', "Code" => ' 12345'));并重新添加数据类型 json。
  • 我让它弹出一个带有数据的警报,当我注释掉 dataType 时,它​​返回:" {"Name":"America","Code" :"12345"} " 这不是 JSON,即使我在我的 php.ini 中使用了 json_encode。我只是继续变得越来越困惑。
  • 好的,我发现了问题所在。我使用了项目中的合作伙伴发送给我的 PHP 文件,该文件最初将数据发送到不同的页面。她把 放在顶部和底部,而 php 在 php 标签中。所以它返回了 PHP 文件的内容,当然,它不是 JSON 格式的。感谢您的帮助。
【解决方案2】:

可变数据是 JSON 格式,如果你添加 dataType: json 或 php 头,jQuery 会为你做。

所以你必须改变:

var jsonData = JSON.parse(data);
By:
var jsonData = data;

【讨论】:

  • 我尝试了该选项,但后来我无法在循环中访问它。我当前的循环允许我使用 element. 访问每个元素,当我只是将变量设置为没有解析的数据时,当我将变量分配给该 element.Name 或 element.Code 时没有发生任何事情。有没有更好的方法来访问循环中的每个键/值对?
【解决方案3】:

如果你需要 POST,这应该可以工作(你不需要在 json 中解析 PHP 编码的数组):

$.post('results.php', // url
        {argOne: "test", argTwo: "test"}, // post data
        function(jsonResponse) { // callback

            $(jsonResponse).each(function (i, element) {
                // do your things
            });
         },'json');

如果可以使用GET方法:

$.getJSON("results.php", function(jsonResponse) { 

    $(jsonResponse).each(function (i, element) {
        // do your things
    });                           
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多