Ajax通信:Perl中格式错误的JSON字符串

时间:2015-12-10 14:15:44

标签: javascript json ajax perl

我想通过XMLHttpRequest将JSON对象发送到Perl脚本(* .cgi) 但我无法解码cgi文件中的JSON对象。

我总是反映错误信息:

  
    

格式错误的JSON字符串,无论是数组,对象,数字,字符串还是原子,都在字符偏移量0(之前)      “(字符串结束)”)

  

这是我的javascript代码:

//ajax communication for receiver/transceiver 
function doAjaxRequest(query) 
{
    if(whatReq == "")
    {
        alert('ERROR: Request-Type undefined');
        return;
    }   

    if (window.XMLHttpRequest) 
    {
        arequest = new top.XMLHttpRequest(); // Mozilla, Safari, Opera
    }   
    else if (window.ActiveXObject) 
    {
        try 
        {
            arequest = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
        } 
        catch (e) 
        {
            try 
            {
                arequest = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
            }
            catch (e)
            {
                alert('ERROR: Request not possible');
                return;
            }
        }   
    }

    if (!arequest) 
    {
        alert("Kann keine XMLHTTP-Instanz erzeugen");
        return false;
    } 
    else 
    {
        var url = "****.cgi";

        var dp = document.location.pathname;

        arequest.open('post', url, true);
        arequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");

        //receiver function
        arequest.onreadystatechange =   function() 
                                        {       
                                            switch (arequest.readyState) 
                                            {
                                                case 4:

                                                    if (arequest.status != 200) 
                                                    {
                                                        alert("Der Request wurde abgeschlossen, ist aber nicht OK\nFehler:"+arequest.status);
                                                    } 
                                                    else 
                                                    {
                                                        var content = arequest.responseText;
                                                        analyseResponse(content);
                                                    }           
                                                break;

                                                default:
                                                        //alert("DEFAULT:" + arequest.readyState );
                                                break;
                                            }
                                        }
        //transceiver function
        query="jsonObj=" + JSON.stringify({name:"John Rambo", time:"2pm"});
        alert(query);
        arequest.send(query)
    }
}

这里是cgi文件:

#!/usr/bin/perl

use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);
use strict;
use warnings;
use JSON;
use Data::Dumper;

my $jsonObj =  param('jsonObj');
my $json  = JSON->new->utf8;
my $input = $json->decode( $jsonObj  );

print Dumper(\$input);
你能帮帮我吗?我不知道如何访问JSON对象。

非常感谢。

2 个答案:

答案 0 :(得分:1)

此消息表明您在$jsonObj中获得了非JSON字符串。一个特殊的常见情况是空字符串。尝试打印$jsonObj的原始内容,并确保正确设置所有内容以使CGI::param正常工作,并使用浏览器实际发送数据的内置工具进行检查。

另外,我强烈建议你扔掉10年前的ActiveX狗屎。您正在使用JSON.stringify,并且所有支持它的浏览器也支持原生XMLHttpRequest

答案 1 :(得分:1)

由于insufficient information to reproduce and diagnose the problem,我即将投票将您的问题暂停,但后来我意识到您的问题确实包含足够的线索来弄清楚错误的原因 - 他们真的很隐蔽。

  • 线索#1 :您的错误消息显示(强调我的):

      

    格式错误的JSON字符串,既不是数组,对象,数字,字符串或原子,在字符偏移0处("(字符串结尾)")

这意味着您的$jsonObj变量的长度为0,即它为空。

那么,导致它变空的原因是什么?好吧,Perl代码看起来像是完全标准的CGI内容,所以问题必须在你的JS代码中,或者在你的避风港没有向我们展示的东西中(例如你的web服务器配置)。既然我们无法调试我们无法看到的内容,那就让我们专注于您的JS代码,我们发现......

  • 线索#2 :这条线路出了问题:

    arequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
    

当然,你可以为POST请求设置any content type you want,但CGI.pm希望以HTML格式提交的标准格式之一接收内容,即{{3 }}。当它收到标记为 application / json 的内容时,它不知道如何解析它,因此不会。因此,Perl脚本中的param()方法不会返回任何内容,因为就其而言,客户端没有发送任何可以理解的参数。

应该在您的网络服务器错误日志中某处发出警告,但您可能没想过要检查这些错误日志。 (提示:你真的应该!)

(您也可以使用either application/x-www-form-urlencoded or multipart/form-data来获取以HTML评论形式发送的警告,但我想您也不知道该选项。另外,为了使这项工作可靠,在 CGI模块之前,你真的需要use CGI :: Carp ,以便它可以捕获任何早期错误。)

无论如何,修复很简单:只需将JS代码中的application/json替换为application/x-www-form-urlencoded,因为这就是您实际尝试发送到服务器的内容。您还应该通过将JSON.stringify()的输出传递给encodeURIComponent()来确保您的JSON数据 在将其嵌入请求之前进行了正确的URL编码,如下所示:< / p>

var data = {name:"John Rambo", time:"2pm"};
var query = "jsonObj=" + encodeURIComponent(JSON.stringify(data));

(我也是第二个Oleg V. Volkov的建议,要求摆脱JS代码中所有过时的ActiveX内容。事实上,你可以通过使用现代的JS实用程序库来做得更好比方说,jQuery提供了方便的包装函数,因此您甚至不必直接使用XMLHttpRequest。)