2011-07-07 14 views
1

サーバー側からクライアント側にハッシュを渡す必要があります。私はフロントエンドとバックエンドでそれぞれjqueryとperl CGI :: Applicationを使用しています。私はjqueryを使用することになると私は初心者ですので、サーバーから返されたJSONデータを処理する方法を示すjqueryフォームのプラグインの例を変更しましたhttp://jquery.malsup.com/form/#json。私は自分の好きなperl WebフレームワークCGI :: Applicationで与えられたコードを使用しようとしました。 CGI::Application::Plugin::JSONは、スカラー値を渡すときにうまく機能しますが、ドキュメントが不足しているため、配列やハッシュを渡す方法や複雑なデータ構造についてはわかりません。ハッシュを渡すとき、私は次のコードスニペットを使用しています: -perl CGI :: Application :: Plugin :: JSONからjqueryフォームプラグインにハッシュを渡す

foreach my $k (sort keys %hash) 
{ 
return $self->add_json_header ({ message => $hash{$k}}); 
} 

これは私がApacheのエラーログに取得していますエラーです:

ajaxtest.pl: Odd number of elements in hash assignment at /usr/local/share/perl/5.10.0/CGI/Application/Plugin/JSON.pm line 98., referer: http://localhost/echo.html

スカラーを通過させながら、私は、CGIを使用しています: :アプリケーション::プラグイン:: JSON json_body機能 私が間違っている場所を教えてください。次のようにもフォームプラグインサイトに付与されたHTMLファイル(リンクは上記)でjQueryのコードです:

// prepare the form when the DOM is ready 
$(document).ready(function() { 
// bind form using ajaxForm 
$('#jsonForm').ajaxForm({ 
// dataType identifies the expected content type of the server response 
dataType: 'json', 

// success identifies the function to invoke when the server response 
// has been received 
success: processJson 
}); 
}); 

function processJson(data) { 
// 'data' is the json object returned from the server 
alert(data.message); 
} 

複雑なデータ構造でCGI::Application::Plugin::JSONを使用して上の任意のアドバイスは、配列のハッシュと配列のハッシュを好きなことはほとんどあり私は将来それを必要としているように歓迎します。

答えて

1

可能な解決策は次のとおりです。

だけJSONライブラリが必要になりますし、あなたのコードに次の操作を行うことができます

my %data_struct = { a => 1, b => 2 }; 
my $json = to_json(\%data_struct, {utf8 => 1}); 
$json =~ s/"(\d+?)"/$1/g; # to_json puts quotes around numbers, we take them off 

# here $self is the CGI::App object, it's probably called like that 
$self->header_add(-type => 'application/json'); 

return $json; 

(ラウルが指摘したように、一度CGIでより多くを返すことはできません::アプリケーションブロック。)

注:私はただそれを必要としなかったので、私はCGI::Application::Plugin::JSONを使用しません。このように私は同じ結果を達成しました。もちろん、TMTOWTDI。 :)

0

私はあなたがCGI :: APPの返品方法を理解しているとは思えません。実行モードごとに1回だけ戻すことができます。

関連する問題