JSON.parse:意外的字符。

3

我正在尝试从PHP jQuery传递JSON,将其转换为SQL查询数组后,出现以下JavaScript错误。

JSON.parse: unexpected character

返回SQL结果的函数:

public function selectassocSql($sql){
$i = 0;
        $resSelect = array();
        mysql_query("SET NAMES 'utf8'");
        $result = mysql_query($sql);
        while ( $row = mysql_fetch_assoc($result) )
        {
            $resSelect[$i] = $row;
            $i++;
        }
        mysql_free_result($result);
        return $resSelect;
}

在这样使用该函数后,

$sql = "SELECT id, code, name FROM table WHERE code LIKE '%$codcli%' ";
$v = $data->selectassocSql($sql);
echo json_encode($v, JSON_FORCE_OBJECT); 

以下是 JavaScript 代码:

$('#formclientes').submit(function(e){

        e.preventDefault();
        $.ajax({
            type: 'POST',
            url:$(this).attr('action'),
            data:$(this).serialize(),
            success:function(data)
            {
              //console.log("SUCCESS " + data);
              var json_cli = $.parseJSON(data);
            }
        })
    })   

我该如何纠正这个错误并从jQuery中读取JSON数据?

1
您的系统存在SQL注入漏洞。 - SLaks
1
要纠正这个错误,你必须拥有有效的JSON。显然,你的PHP脚本没有创建有效的JSON。提供一个json_encode($v, JSON_FORCE_OBJECT)输出的例子会很有帮助。 - Felix Kling
1
在尝试解析数据之前,请先在JS中转储“data”,确保其中除了JSON之外没有其他内容(例如,没有PHP警告/错误消息)。 - Marc B
1
@FelixKling他不需要$ .parseJSON调用,jQuery会猜测dataType并为您解析响应:data已经是json。 - Nicola Peluchetti
1
@FelixKling: json_encode 总是返回有效的 json(例如字符串(4)"null"),但是,错误报告和显示错误可能设置为输出除 json 字符串之外的更多内容。 - hakre
2个回答

7
你不需要使用 $.parseJSON 函数,因为 jQuery 会自动解析 JSON 数据。如果你没有指定 dataType 属性,jQuery 会尝试猜测数据类型,并在将数据传递给成功函数之前调用正确的函数来解析响应数据。
   $.ajax({
        type: 'POST',
        url:$(this).attr('action'),
        data:$(this).serialize(),
        success:function(data)
        {
          //console.log("SUCCESS " + data);
          var json_cli = data;
        }
    })

也请查看这个问题:为什么不需要使用'jQuery.parseJSON'?

0

我在使用类似以下数据时,在Firefox 10.0.2中遇到了这个问题:

[ { "firstName": 'Joe', "lastName": 'Smith' } ]

(由于数组中有多个对象,为了清晰起见而缩短)

使用eval解析时实际上可以正常运行,但是不能用JSON.parse。(我这里没有使用jQuery。)

当我将'改为"来表示值时,问题就解决了:

[ { "firstName": "Joe", "lastName": "Smith" } ]

我认为“要求”仅适用于属性名称,而不适用于数据值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接