【问题标题】:jQuery AJAX to Perl JSON module decode of datajQuery AJAX 到 Perl JSON 模块的数据解码
【发布时间】:2013-03-31 17:54:09
【问题描述】:

我需要能够解码从 ajax 调用的数据部分到 perl cgi 脚本的多个参数。我知道其他一切都在使用我的代码,但无论出于何种原因,我似乎都无法让 JSON 模块的 decode 方法正常工作以再次将数据从 JSON 格式恢复为参数。我的jQuery ajax调用中的数据是这样设置的,没错。

data: {
    maxRows: 5,
    productName: request.term
}

但是,我尝试将其解析为 perl 的方式有问题。

my $json = JSON->new->utf8->allow_nonref;
my $json_text = $cgi->param('data');
my $json_array = $json->decode( $json_text );

我知道正确的最终结果应该是一个哈希数组。如果我能走到那一步,我知道我会没事的。但是,我的 decode 行不起作用,实际上导致整个脚本在执行时失败。

我已经环顾四周,但我无法弄清楚这一点。我很确定这是一些非常小的调整。

我是否通过使用 $cgi->param('data') 正确获取了参数?它最终会被命名为数据,还是别的什么?

【问题讨论】:

    标签: jquery ajax json perl cgi


    【解决方案1】:

    您的 JSON 数据无效。使用JSONLint 验证您的数据。 JSON数据的正确示例如下:

    {
        "maxRows": 5,
        "productName": "request.term"
    }
    

    如果您省略 data: 键并用引号将对象内的所有键括起来,您应该没问题。表达式 request.term 不允许在字符串之外,因为它没有被定义。

    编辑

    好的,您正在使用 jQuery 发送 JSON 数据。查看here,了解如何通过 Ajax 从 jQuery 正确发送 JSON。此外,我建议使用FireBug 来检查 jQuery.ajax 发布的数据。

    【讨论】:

    • 你确定吗? jQuery API 和演示已经按照我上面的方式完成了。我什至测试了这个演示的代码:jqueryui.com/autocomplete/#remote-jsonp 我自己并且它有效。我只是没有服务器端脚本可以查看它是如何在那里解析的。
    • 是的,我以前见过这种方法,我想我只是想更深入地了解如何使用 CGI.pm 获取 AJAX 数据。相比之下,这种方法似乎是一种黑客行为。 ibm.com/developerworks/webservices/library/ws-simplelogin 这使用了相同的概念。我知道我目前的工作方式,我只是不知道 geonames.org 正在使用的解析技术。但我想乞丐不能挑剔。
    • 在另一个说明中,我使用的是 Google Canary 并打开了开发者工具。我可以看到查询字符串参数显示为:maxRows:5 productName:bi(如果我在输入中输入 bi)。所以即使是开发者工具也能正确解析它们,这特别令人讨厌。
    • 我相信 Perl JSON 模块对 JSON 语法相当挑剔。
    • 我明白了,但我认为我的问题在于 CGI.pm 模块,而不是 JSON.pm 模块。嗯要去测试它在哪里被定义...
    【解决方案2】:

    如果您将此作为(异步)POST 请求从 jQuery 发送到您的 Perl 脚本,您需要给它一个参数以供 CGI 解析。否则,您将需要查看整个身体。 CGI 无法解析这个数据的东西,因为它的格式不正确。

    请求的正文必须采用这种形式,$cgi->param('data') 才能工作:

    data=data:{maxRows:5,productName:request.term}
    

    请尝试使用 POSTDATA 来获取发送到您的脚本的 HTTP 请求的完整正文。

    my $data = $query->param('POSTDATA');
    my $json_array = $json->decode( $data );
    

    请参阅CGI doc 了解更多信息。这个问题也可能有帮助:How can I get the entire request body with CGI.pm?

    【讨论】:

    • 投反对票的人能否解释一下这个答案有什么问题?
    • 不是我。我给了你+1。我认为这是应该如何解决这个问题的思路,但正如目前所说的那样不起作用。我玩了几个小时,也无法让它正常工作。最终只使用了此处显示的准黑客方法:ibm.com/developerworks/webservices/library/ws-simplelogin/…
    • @sage88 我认为现在你想做的事情是有道理的。你真的只需要在你的 POST 中提交一些参数。那里不需要 JSON。
    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2012-02-14
    • 2014-11-15
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多