【问题标题】:Parsing JSON : unexpected character解析 JSON:意外字符
【发布时间】:2013-05-31 05:09:41
【问题描述】:

这个问题与我之前写的here有关。

这个 JSON 语法正确吗?之后我需要它来制作 jqPlot 图表

[{"Date":"2012-02-29","Close":"87.60"},{"Date":"2012-02-28","Close":"87.77"},{"Date":"2012-02-27","Close":"88.07"}]

我问这个是因为我不能在这个字符串中使用jQuery.parseJSON(jsonString);JSON.parse(jsonString);。火狐返回:

SyntaxError: JSON.parse: 意外字符@index2.php:677


这是生成它的 PHP 代码:

<?php
    $req = $bdd->prepare('SELECT Date, Close FROM quotes WHERE Symbol = ? AND Date > ? AND Date < ?');
    $req->execute(array($_GET['id'], $_GET['datemin'], $_GET['datemax']));

    $test=array();
    while ($donnees = $req->fetch(PDO::FETCH_ASSOC))
    {
        // echo print_r($donnees) . "<br />";
        // echo $donnees[Date] . "<br />";
        $test[] = $donnees;
    }

    echo json_encode($test);
?>

我不知道怎么了。



编辑:添加了 Javascript 代码。

<script>
$("button").click(function(){
    $.get("requete_graph.php", {
        id: param1,
        datemin: param2,
        datemax: param3
    }, function(data,status){
        console.log(data);
        make_graph(data);
    }, "json");
}); 

function make_graph(toto) {
    alert("String before : " + JSON.stringify(toto));
    var json_parsed = JSON.parse(toto);
    alert("String after : " + JSON.stringify(json_parsed));

    $(document).ready(function(){
        var plot1 = $.jqplot('chartdiv', json_parsed);
    });
}
</script>

【问题讨论】:

  • 告诉我们JSON.parse的电话!您的 JSON 似乎是有效的,也许您意外地回显了它周围的一些其他字符。
  • 有效。将来考虑使用jsonlint.com 进行检查。但是,只有当它作为 javascript 字符串传递时,它才能被解析。
  • 我们看到的JSON是正确的。你确定没有别的了吗?你在浏览器中查看结果了吗?
  • @crush 不要随意应用utf8_encode,尤其是在数据甚至不包含任何非ASCII字符的情况下。
  • datatoto 应该是 objects,而不是 JSON 字符串。你为什么是parsingtoto

标签: php javascript json parsing


【解决方案1】:

JSON 确实有效(您可以在jsonlint.com 进行检查

您的问题可能是由于在 JSON 之后发送了额外的非空白字符(例如:PHP 错误/警告)。保证在 JSON 之后不输出任何其他内容的好方法是使用 PHP 的 die 函数发送内容然后停止执行。

die(json_encode($test));

// OR
echo json_encode($test);
die();

【讨论】:

  • 在回显 JSON 后,我看不到任何额外的字符被发送。我看到一个不需要存在的 PHP 结束标记,但额外的空白不会使他的 JSON 无效。
  • @crush 我的意思是 PHP 错误或警告之类的额外信息 - 我会更新我的答案以澄清。
【解决方案2】:

在 PHP 脚本的顶部,添加:

header('Content-type: text/json; charset=utf-8');

如果你没有,服务器会以纯文本的形式发送,你的浏览器不会知道它是一个 json 字符串。

【讨论】:

  • 我更喜欢application/json我自己。
  • 另外,我认为这不会解决 OP 的问题。 @deceze 上面建议的评论是问题所在。
【解决方案3】:

jQuery.get,给定正确的 dataType 参数(您已经这样做了)或内容类型标头,已经为您解析了 JSON。您的回调函数接收一个数组作为 data 参数,而不是字符串。

var json_parsed = JSON.parse(toto);

然后会抛出一个错误,因为toto 不是JSON 字符串(你的FF 似乎是.toString() 数组,然后遇到无效字符)。相反,只需使用

function make_graph(toto) {
    console.log(typeof toto, toto);
    alert("String before : " + JSON.stringify(toto));
    var json_parsed = toto; // or just use `toto` everywhere

    $(document).ready(function(){
        var plot1 = $.jqplot('chartdiv', json_parsed);
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多