Perl/cgiプログラムからJSON応答を書いています。ヘッダーのコンテンツタイプは「application/json」である必要があります。しかし、応答がテキストファイルとしてスローされるため、認識されないようです。
JQueryのJSONライブラリを使用して応答をキャプチャします。 JSON応答の送信でどこが欠けていますか。
私はこれを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に変換するのは簡単です。
PerlのWebフレームワークである Mason でリクエストを生成する方法は次のとおりです。
メイソンはパイロンまたは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>
そしてそれを プロトタイプ 、JavaScript Webアブストラクションで処理します:
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
}
});
タイプ「application/json」を指定した場合でも、テキストを解析する必要があります。 jQueryは、$。getJSON関数を使用してこれを行います。
$.getJSON("http://someurl.com/blabla.json",{some: "info"},function(json){
alert(json["aKey"]["anotherOne"]);
});
(ここでは specs )。
しかし、おそらくあなたはすでにこれを知っているので、問題はどこかにあります:おそらく問題は無効であるため、json応答のサンプルを教えてください。なぜ「認識されていないようだ」と言うのか、私にはよくわかりません。jsonサービスを作成するとき、最初に行うテストは、ブラウザーでそれらを呼び出し、Firebugを起動して、それを解析しようとすることです(そう、応答はそうです)。これはテキスト応答ですが、javascriptを解析して、jsonオブジェクトを返すことは非常に喜ばしいことです)。