目前获得以下变量
" {"错误":"错误的帐户"}"
我正在解析它
var message = JSON.parse(event.data);
console.log(message['error'])
console.log有效,但我收到此错误
SyntaxError:JSON.parse:第1行第1列的意外字符 JSON数据
我认为json格式是正确的(使用php json_encode制作)所以我真的不知道错误
答案 0 :(得分:4)
因此经过一些调试(参见下面反向链接)后发现问题是另一条消息,其中没有JSON编码首先被相关代码捕获。
虽然我们可以追溯到其他消息的来源(在进一步的讨论中,显然有一个握手是在同一个套接字上发送并被这个处理程序拾取 - 最后的罪魁祸首!),它可能更容易丢弃它,所以我们需要一些验证码:
归功于@Gumbo和@Matt对以下内容的答案的混合(因为我们需要实际运行测试,但是想要检查null / etc情况,所以我们'当我们去引用返回对象时不要抛出错误)
function IsValidJSON(test) {
try {
var obj = JSON.parse(test);
if (obj && typeof obj === "object" && obj !== null) {
return true;
}
} catch (e) {
}
return false;
}
使用该功能,现在我们只需将原始代码更改为:
var message;
if (IsValidJSON(event.data)) {
message = JSON.parse(event.data);
console.log(message['error']);
}
我将以下早期版本的答案留作调试跟踪,因为这最终成为一个发现问题的过程,而不是问题和解决方案不言自明的过程:
所以这变得有点神秘,让我们回到基础并验证输出中没有任何奇怪/不可打印的内容:
var asciioutput = event.data.charAt(0) + ':' + event.data.charCodeAt(0);
for (var i = 1; i < event.data.length; i++) {
asciioutput += ', ' + event.data.charAt(i) + ':' + event.data.charCodeAt(i);
}
console.log(asciioutput);
您应该在控制台中得到如下结果:
{:123, ":34, e:101, r:114, r:114, o:111, r:114, ":34, ::58, ":34, W:87, r:114, o:111, n:110, g:103, :32, a:97, c:99, c:99, o:111, u:117, n:110, t:116, ":34, }:125
如果您的变量包含那些包装引号,那么它们就是问题:删除它们。
换句话说,如果console.log(event.data)
显示字面"{"error":"Wrong account"}"
,那么在尝试将其解析为JSON之前,需要删除包装引号,使变量变为{"error":"Wrong account"}
。
例如:
var message;
if (event.data.slice(0,1) == '"') {
message = JSON.parse(event.data.slice(1,-1));
} else {
message = JSON.parse(event.data);
}
(有关工作示例,请参阅jsfiddle - 请注意名称更改)
(请注意,这个例子完全假定如果有一个起始引用,那么还有一个结束引用:如果不是这样,你可能想要构建更多的逻辑)