我在下面的代码块中不断收到此错误:
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" error和I keep getting "Uncaught SyntaxError: Unexpected token o"
然而,答案都没有帮助。因为当我第一次运行JSON.parse(message.data)时,我得到的字符串不是Object。因此,我必须再次运行JSON.parse以最终获得一个真实的对象。
这是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)
,所以我需要另一张检查来对其进行双重解析。
答案 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;
答案 1 :(得分:1)
您使用message.data
指定的JSON字符串不是一个格式良好的JSON解析为String。这可能是因为服务器在建立连接期间/之后向您发送了多部分消息。
我建议您打印在OnMessage
函数中收到的消息对象,并分析它们是否完全形成有效的JSON字符串。
答案 2 :(得分:0)
您的 message.data 似乎不完整。
看看您正在使用的库文档,也许您应该收集数据直到它结束?也许有一些onEnd方法?