2012-02-14 3 views
1

jQuery.getJSON()メソッドを使用してjavascript辞書をサーバーに送信することに大きな問題があります。私はこの辞書はJScriptで宣言した:なぜjQuery.getJSON()はJavaScriptの辞書を平坦化していますか?

data = {'a': 1, b:{'c':2, 'd':3}}; 

私が呼ぶとき:

{'a':1, 'b[c]':2, 'b[d]':3}. 

お知らせサブ辞書が平坦化されたこと:

jQuery.getJSON("myurl", data, callback) 

は、サーバーがこれらの値を持つ辞書を受け取ります'b'キーをサブキー 'c'と 'd'と組み合わせることにより、高度にネストされたデータの場合、これは非常に不快です。

私はこれがjavascriptとJSONシリアライズの問題であるかどうか、またはPythonとPyramid(データを受け取るWebフレームワーク)の問題かどうかはわかりません。私はデータを送信する前に文字列化しようとしましたが、Pythonのjsonライブラリを使用して逆シリアル化していますが、エラーが発生するだけです。

お願いします。

+0

本当に一重引用符を使用していますか?その場合は二重引用符で変更してみてください。 "b"にも引用符を入れてください。 –

+0

@ MarkSchultheissこれはJSONではなくJavascriptオブジェクトのリテラルであることに注意してください。一重引用符を使用すると、プロパティ名に引用符をまったく使用しない場合と全く同じです。 – kapa

+0

@bazmegakapa - はい、これがシリアル化されたオブジェクトかリテラルかどうかを質問するのは難しいですが、シリアル化されていません。 –

答えて

2

データの送信方法は正しいです。

データフィールドは、HTTP経由で送信されるデータを意図しています。これをHTTP getで送信すると、クエリ文字列にパラメータが表示されます。

myurl?a=1&b%5Bc%5D=2&b%5Bd%5D=3 

エスケープさURL:サーバーにJSONを送信したい場合は

myurl?a=1&b[c]=2&b[d]=3 

、あなたはそれを文字列化する必要があります。 JSON.stringify() IE8以前のサポートのためにJSONライブラリを含める必要があります。

文字列化されたデータを変数に割り当てる必要があります。

jQuery.getJSON("myurl",{data: JSON.stringify(data)}, callback); 

これはdataという変数でサーバーに渡されます。

+0

+1、私も入力していました。 –

+1

実際、私はstringifyを使用しようとしました:jQuery.getJSON( "myurl"、JSON.stringify(data)、コールバック)、バックエンドで不適切に処理しない限り、問題は解決しませんでした。 Pythonでは、変数を使ってデータをキャプチャし、jsonライブラリをインポートし、json.loads(data)と呼んで、 "expected string or buffer"というエラーを投げました。何か案は? –

+0

文字列化されたデータを変数に割り当てる必要があります。あなたのサーバーに 'data'という変数で渡されます。 – Gazler

関連する問題