JSON解析意外的非空白字符

时间:2015-02-04 18:45:12

标签: javascript json

目前获得以下变量

  

" {"错误":"错误的帐户"}"

我正在解析它

var message = JSON.parse(event.data);
console.log(message['error'])

console.log有效,但我收到此错误

  

SyntaxError:JSON.parse:第1行第1列的意外字符   JSON数据

我认为json格式是正确的(使用php json_encode制作)所以我真的不知道错误

1 个答案:

答案 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 - 请注意名称更改)

(请注意,这个例子完全假定如果有一个起始引用,那么还有一个结束引用:如果不是这样,你可能想要构建更多的逻辑)