jQuery.ajaxから返されたPOSTアクションを使用してJSONを解釈するにはどうすればよいですか?
質問
次のjQueryコードがあります:
$.ajax({
type: "POST",
url: "Services/MyService.asmx/Select",
dataType: "json",
data: "{'data':'test'}",
contentType: "application/json; charset=utf-8",
success: function(msg){
alert(msg);
},
error: function(xhr){ alert(xhr.statusText);}
});
メソッドの呼び出しは次を返します:
"{"FirstName":"James"}"
値を取得すると、アラートは完全なJSON文字列を返します。 alert(msg.FirstName)
を実行しようとすると、" undefined"と表示されます。
getJSON()メソッドを使用した多くの例を見てきました。ただし、POST動詞にそれを使用する方法は見ていません。誰も私が間違っている正しい方向に私を向けることができますか? jqueryのドキュメントに基づいて、戻り値は同じdataType(json)である必要があるため、何が欠けているのかわかりません。
編集: 私は自分のサービスを調べましたが、文字列を返すメソッドシグネチャの観点から見た一致する例です。応答タイプがapplication / jsonであることも確認しました。
EDIT2: 応答を更新して、外部引用符を含めました。また、カスタムJavaScriptConverterを使用してJSONシリアル化を行っています。カスタムコンバーターは、オブジェクトプロパティ(この場合はFirstName)を取得し、その値をASP.Net AJAX Extensions v1.0が簡単にシリアル化できる辞書コレクションにロードします。
EDIT3:
eval()で発生した問題( Expect&quot ;; quot;
エラーの原因)を見ると、jsonプロパティ名も引用符で囲まれていることがわかりました。プロパティ値(値ではなく)から引用符を削除すると、eval()が再び機能しました。今、この問題のサーバー側を調べています。
解決
jQueryの .ajax
の使用法は安定しているように見えます。返されたデータをどのように確認していますか? Firebug?フィドラー? .asmx
Webサービスは {" FirstName":" James"}
のようなデータを返さないためです。応答は次のようになります。
{"d":{"FirstName":"James"}}
( http:をご覧ください。 //encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/ )
success
コールバックについては、次を試してください:
function(res) { alert(res.d.FirstName) }
編集:ASP.Net AJAXのv1.0の更新およびコメントを見た:
応答をシリアル化することでv1.0がどのように機能するかはわかりませんが、WebServiceメソッドで独自のカスタムJSONシリアル化を実行している場合、応答はJSONでシリアル化されている可能性があります 。したがって、2回シリアル化しています。
使用しているすべてのコンポーネントが本来の動作をしていると思います。サーバーで手動でシリアル化するため、 success
コールバックは手動で非シリアル化する必要があります。
function(res) {
res = eval('(' + res + ')');
alert(res.FirstName);
}
他のヒント
IIRCで文字列を評価でき、結果はjsonオブジェクトになります。
myJSON = eval(jsonString);
2番目のパラメーターとしてJSONオブジェクトを使用して投稿変数を定義できます。
例:
$.getJSON("service.py",
{ foo: bar },
function(data) {
$.each(data, function() { // blah });
}
);
編集:どういう意味かわかりました。サービスは" something / json"を返しますか? MIMEタイプとして? Firebugの応答ヘッダーを見ると、次のようになります。
Content-Type application/json; charset=utf-8
次のようなものを試してください:
result = eval('(' + result.d + ')');
System.Web.Extensions
でシリアル化されたASMXサービスでは、 $ getJSON
を使用できません。 $。ajax()
を使用して正しく呼び出しを行っています。
Firebugを使用して成功ハンドラー内にブレークポイントを設定し、 msg 値を検査しましたか?