在位置1的JSON中出现意外的令牌o

时间:2016-07-25 20:17:37

标签: javascript json parsing

我在下面的代码块中不断收到此错误:

function openWebsocket(url) {
    var ws;
    ws = $websocket(url);
    ws.onOpen(function(event) {
        console.log(' Websocket connection established:', event);
    });
    ws.onMessage(function(message) {
        var userObj   = UserFactory.getUserObject();
        var settings  = userObj.alert_settings;

        // The JSON parsing...
        var parsedMsg = JSON.parse(message.data);
        var alert     = JSON.parse(parsedMsg);
        var date      = new Date(parseFloat(alert.start_epoch+'000'));
        alert.hour    = date.getHours() +':'+date.getMinutes();
        alert.percent_change = Math.round(alert.percent_change);

        var shouldPush = main_alert_filter(settings, alert);
        updateFeed(alerts, shouldPush, alert);
    });
}

我查看了Parsing JSON giving "unexpected token o" errorI keep getting "Uncaught SyntaxError: Unexpected token o"

然而,答案都没有帮助。因为当我第一次运行JSON.parse(message.data)时,我得到的字符串不是Object。因此,我必须再次运行JSON.parse以最终获得一个真实的对象。

enter image description here

这是message.data的样子:

" "{\"term\": \"\\\"nike\\\"\", \"percent_change\": 125, \"hour\": \"10:9\", \"term_id\": 2890413, \"start_epoch\": 1420474140, \"term_trend_id\": 793950, \"end_epoch\": 1420477740, \"formatted_date_difference\": \"January 5, 2015\", \"tickers\": [\"NKE\", \"$PUM\", \"ADDYY\", \"LULU\", \"UA\", \"HIBB\"], \"twitter_preview\": \"\", \"type\": \"spike\", \"approved\": 1, \"search_preview\": [\"\"]}" "

现在,在第一次解析后,parsedMsg是一个如下所示的字符串:

{"term": "minimum wage +increase", "percent_change": 729, "hour": "9:14", "term_id": 2522115, "start_epoch": 1447168440, "term_trend_id": 657898, "end_epoch": 1447175700, "formatted_date_difference": "November 10, 2015", "tickers": ["$JAB", "$SLCY", "AAL", "AAPL", "ABCD", "ABTL", "ADDYY", "ADM", "AEO", "AFCO", "AHC"......

最后我需要一个实际的对象,所以我必须再次运行JSON.parse才能得到这个:

Object {term: "minimum wage +increase", percent_change: 729, hour: "9:14", term_id: 2522115, start_epoch: 1447168440…}

另外需要注意的是,当我在Chrome中踩到时,我从来没有遇到过这个错误。只有当我没有设置断点时才会发生这种情况。这可能是竞争条件类型问题吗?就像它尝试JSON.parse一些尚未准备好解析的东西?

更新

好的,有时候JSON显然是无效的,有时候也没有,到目前为止,我做得很好,没有错误,下面的片段,想法?

if (typeof alert === 'object') {
    // do nothing...
} else {
    var alert = JSON.parse(alert);
}

大多数情况下alert的{​​{1}}结果是JSON.parse(message.data),所以我需要另一张检查来对其进行双重解析。

3 个答案:

答案 0 :(得分:2)

你为什么第二次parse你的json,它已经在第一次尝试时被解析了。

查看代码段



var obj = "{\"term\": \"minimum wage +increase\", \"percent_change\": 729, \"hour\": \"9:14\", \"term_id\": 2522115, \"start_epoch\": 1447168440, \"term_trend_id\": 657898, \"end_epoch\": 1447175700, \"formatted_date_difference\": \"November 10, 2015\", \"tickers\": [\"$JAB\", \"$SLCY\", \"AAL\", \"AAPL\", \"ABCD\", \"ABTL\", \"ADDYY\"]}";
$(function(){
  var data = JSON.parse(obj);
  alert(typeof data);
  console.log(data.tickers[0] +" -> an item in `tickers` array");
  console.log(data.tickers);
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您使用message.data指定的JSON字符串不是一个格式良好的JSON解析为String。这可能是因为服务器在建立连接期间/之后向您发送了多部分消息。

我建议您打印在OnMessage函数中收到的消息对象,并分析它们是否完全形成有效的JSON字符串。

答案 2 :(得分:0)

您的 message.data 似乎不完整。

看看您正在使用的库文档,也许您应该收集数据直到它结束?也许有一些onEnd方法?