如何从Perl CGI程序发送JSON响应?

时间:2009-01-12 13:48:10

标签: javascript perl json

我正在从perl / cgi程序编写JSON响应。标题的内容类型必须是“application / json”。但它似乎没有得到认可,因为响应被抛出作为文本文件。

我将使用jQuery的JSON库捕获响应。我在发送JSON响应时遗漏了哪里。

3 个答案:

答案 0 :(得分:27)

我在perl / cgi程序中这样做。

我在代码的顶部使用了这些:

use CGI qw(:standard);
use JSON;

然后我打印json标题:

print header('application/json');

这是一种内容类型:

Content-Type: application/json

然后我打印出这样的JSON:

my $json->{"entries"} = \@entries;
my $json_text = to_json($json);
print $json_text;

我的javascript调用/处理它:

   $.ajax({
        type: 'GET',
        url: 'myscript.pl',
        dataType: 'json',
        data: { action: "request", last_ts: lastTimestamp },
        success: function(data){
            lastTs = data.last_mod;
            for (var entryNumber in data.entries) {
                 //Do stuff here
            }
        },
        error: function(){
            alert("Handle Errors here");
        },
        complete: function() {
        }
    });

如果您不想安装它,则不一定要使用JSON库,您可以直接打印JSON格式的文本,但它可以轻松地将perl对象转换为JSON prety。

答案 1 :(得分:1)

即使您指定类型“application / json”,您仍然需要解析文本。 jQuery使用$ .getJSON函数为您执行此操作,即:

$.getJSON("http://someurl.com/blabla.json",{some: "info"},function(json){
  alert(json["aKey"]["anotherOne"]);
});

(这里是specs)。

但也许你已经意识到这一点,所以问题存在于其他地方:你能告诉我们你的json响应的样本,因为问题可能是无效的。我不清楚为什么你说“似乎没有得到认可”:当我写json服务时,我做的第一个测试就是在浏览器上调用它们并且可能启动firebug并尝试解析它(所以是的回复这是一个文本响应,但是javascript它仍然很乐意解析它并返回一个json对象。)

答案 2 :(得分:1)

以下是如何在Mason(Perl的Web框架)中生成请求。

Mason类似于Pylons或Ruby On Rails。

<%init>

use JSON;

my %hash = { a => 'a', b => 'b' };
my @list = ( 1, 2, \%hash );

# Mason object $r for Apache requests, automatically sets the header
$r->content_type('application/json');

# Pass a reference to anything (list, hash, scalar) for JSON to encode
my $json = new JSON;
print $json->encode(\@list);

</%init>

然后在Prototype中处理它,即JavaScript网络实施:

var req = new Ajax.Request('request.html', {
    method: 'get',
    parameters: {
        whatever: 'whatever'
    },
    onCreate: function() {
        // Whatever
    },
    onSuccess: function(response) {
        // This only works if you set the 'application/json' header properly
        var json = response.responseJSON;

        // Since you sent a list as the top-level thing in the JSON,
        // then iterate through each item
        json.each(function(item) {
            if (item instanceof Object) {
                item = new Hash(item);
            } else if (item instanceof Array) {
                // Do array stuff
            } else {
                // Do scalar stuff
            }
        });
    },
    onFailure: function() {
        // Failed
    }
});