【问题标题】:Unexpected token o in JSON at position 1位置 1 处的 JSON 中的意外标记 o
【发布时间】:2023-04-08 05:58:02
【问题描述】:

我在下面的这段代码中不断收到这个错误:

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) 时,我得到一个字符串而不是一个对象。因此,我必须再次运行 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 显然是无效的,有时不是,到目前为止,我在下面的 sn-p 方面做得很好,没有错误,想法?

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

大多数时候JSON.parse(message.data)alert 结果是string,所以我需要另一个检查来双重解析它。

【问题讨论】:

  • 当我JSON.parse(...) 你的第一个字符串(嗯,它的一个有效子集)时,我得到了最终对象,而不是你声称得到的临时字符串。如果我解析 那个 对象,我会得到你得到的错误......
  • 您的parse JSON 不完整!请分享完整的 JSON 结果,以便我们发现错误。
  • 对不起,它是完整的,它只是超级大,我不想发布整个东西。
  • 您更新的message.data 不可能是实际数据,不是吗?它在第一个引号之后和最后一个引号之前有换行符。而那些三重反对 - 这就是数据中真正的内容吗?
  • @LeonGaban 你更新的message.data 完全无效,开头有两个` "`,它的无效字符串,解析为json 离它很远。

标签: javascript json parsing


【解决方案1】:

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

看看sn-p

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>

【讨论】:

  • 我不得不第二次解析它,因为第一次通过它仍然是typeof string 所以我在alert.user can't set user to string 上遇到错误。
  • @LeonGaban 它的类型是object 检查更新的snippet 你可以访问对象中的任何内容,一旦字符串被解析为json对象,它的解析,不需要第二次解析,如果你仍然有问题,您可以向我们展示整个对象。希望这会有所帮助:)
  • 检查您的浏览器控制台,您可能会找到答案,并且您会很好地理解您的第一个格式化的 json 对象......看看那个。谢谢
  • 刚刚用完整的message.data JSON 更新了我的问题
【解决方案2】:

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

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

【讨论】:

  • 刚刚用完整的message.data JSON 更新了我的问题
【解决方案3】:

您的 message.data 似乎不完整。

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

【讨论】:

  • 对不起,它是完整的,只是超级大,所以不想发布整个 JSON,但如果需要,我可以。
  • 您是否尝试在检查员的控制台中解析响应? IMO不可能你应该解析它两次:)也许有一些格式错误的数据,比如未转义的 " fe.?
  • @MarcinBogusz:当然可以,如果原始 JSON 数据被字符串化两次。例如:JSON.stringify( JSON.stringify({ "foo": "bar" }) )。这给了你这个字符串:"{\"foo\":\"bar\"}"。 (这里的外引号是字符串的一部分,而不是引号包围字符串。)解析一次会给你字符串(不是对象){"foo":"bar"};第二次解析得到原始对象{foo: "bar"}
  • 作为另一个例子,JSON.stringify(true) 返回字符串trueJSON.stringify( JSON.stringify(true) ) 返回字符串"true"(同样,这里的引号是字符串的一部分)。解析此结果一次返回 string true,解析 that 返回 booleantrue,例如JSON.parse( JSON.parse( JSON.stringify( JSON.stringify(true) ) ) ).
猜你喜欢
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 2017-10-08
相关资源
最近更新 更多