Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON解析意外的非空白字符_Javascript_Json - Fatal编程技术网

Javascript JSON解析意外的非空白字符

Javascript JSON解析意外的非空白字符,javascript,json,Javascript,Json,当前获取了以下变量 {错误:错误帐户} 我像这样解析它 var message = JSON.parse(event.data); console.log(message['error']) console.log可以工作,但我收到了这个错误 SyntaxError:JSON.parse:的第1行第1列处出现意外字符 JSON数据 我认为使用php json_encode生成的json格式是正确的,因此我不知道错误出在哪里因此,经过一些调试后,请参见下面的反向链接,问题是另一条非json编码的

当前获取了以下变量

{错误:错误帐户}

我像这样解析它

var message = JSON.parse(event.data);
console.log(message['error'])
console.log可以工作,但我收到了这个错误

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


我认为使用php json_encode生成的json格式是正确的,因此我不知道错误出在哪里

因此,经过一些调试后,请参见下面的反向链接,问题是另一条非json编码的消息首先被相关代码捕获

虽然我们可以通过进一步的讨论追踪到另一条消息的来源,但显然有一个握手是在同一个套接字上发送的,最终被这个处理程序抓到了罪犯!,删除它可能更容易,因此我们需要一些验证代码:

因为我们需要实际运行一个测试,但也要检查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);
如果您的变量包含这些换行引号,那么它们就是问题所在:删除它们

换句话说,如果console.logevent.data按字面意思显示为{error:error account},那么在尝试将变量解析为JSON之前,需要去掉包装引号,使变量变成{error:error account}

例如:

var message;
if (event.data.slice(0,1) == '"') {
message = JSON.parse(event.data.slice(1,-1));
} else {
message = JSON.parse(event.data);
}
有关工作示例,请参见注释名称更改


请注意,此示例完全假设如果有起始报价,还有一个结束语:如果这不一致,您可能需要构建更多的逻辑

,因此,在进行一些调试后,请参阅下面该链的相反部分,问题是另一条不是JSON编码的消息首先被相关代码捕获

虽然我们可以通过进一步的讨论追踪到另一条消息的来源,但显然有一个握手是在同一个套接字上发送的,最终被这个处理程序抓到了罪犯!,删除它可能更容易,因此我们需要一些验证代码:

因为我们需要实际运行一个测试,但也要检查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);
如果您的变量包含这些换行引号,那么它们就是问题所在:删除它们

换句话说,如果console.logevent.data按字面意思显示为{error:error account},那么在尝试将变量解析为JSON之前,需要去掉包装引号,使变量变成{error:error account}

例如:

var message;
if (event.data.slice(0,1) == '"') {
message = JSON.parse(event.data.slice(1,-1));
} else {
message = JSON.parse(event.data);
}
有关工作示例,请参见注释名称更改


请注意,此示例完全假设,如果有起始引号,也有结束引号:如果不一致,您可能希望构建更多逻辑

文件开头可能的BOM?event.data是{error:error account}转义引号吗?如下所示:{\error\:\error account\}console.logescapeevent.data;这是您期望的吗?文件开头可能有BOM?event.data是{error:error account}转义引号吗?如下所示:{\error\:\error account\}console.logescapeevent.data;这是您所期望的吗?我认为是由console.log添加的,因为删除第一个和最后一个字符会从stringTry中删除{},使用的代码与我添加的示例类似,该示例测试引号在开始时是否存在。至少在chrome中,控制台不会向字符串添加引号,请参阅:打开控制台时,如果您看到所有这些console.log输出周围都有引号,那么是的,您在chrome上添加了QuoteKey来解析事件。数据,但不删除任何内容可以正常工作,但我收到一个随机错误->未捕获SyntaxError:意外标记c,或者令牌dIt实际上开始听起来像您的event.data已经是JSON格式的对象:请尝试删除JSON.parse,查看在最后一个示例上第二次尝试解析时控制台中发生的情况:not sliced!没有定义是的
json来自json_encode php函数。如果我删除json parse CALING.error将给出undefined…我认为是由console.log添加的,因为删除第一个和最后一个字符会从stringTry中删除{},使用类似于我添加的示例代码测试引号在开头的存在性。至少在chrome中,控制台不会向字符串添加引号,请参阅:打开控制台时,如果您看到所有这些console.log输出周围都有引号,那么是的,您在chrome上添加了QuoteKey来解析事件。数据,但不删除任何内容可以正常工作,但我收到一个随机错误->未捕获SyntaxError:意外标记c,或者令牌dIt实际上开始听起来像您的event.data已经是JSON格式的对象:请尝试删除JSON.parse,查看在最后一个示例上第二次尝试解析时控制台中发生的情况:not sliced!未定义是的,json来自json_encode php函数。如果我删除json解析调用。错误将给出未定义的。。。