12

JSからのAJAX呼び出しを介して複合JSON構造を渡し、サーバー側で、Pythonで「非常に類似した」データ構造として読み取るにはどうすればよいですか?

jsonフォーマット(simplejsonなど)を使用できることは理解していますが、私の場合、QueryDict自体が不正または再フォーマットされているとどういうわけか感じますか?

例:

JSONオブジェクトの配列[{"id":1}、{"id":2}、{"id":3}]をAJAX経由でDjangoビューに渡すと、QueryDictは次のようにフォーマットされます。

POST:<QueryDict: {u'json_data[0][id]': [u'1'], u'type': [u'clone'], 
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'], 
u'json_data[1][id]': [u'2'], u'json_data[2][id]': [u'3']}>

json_dataを反復処理するにはどうすればよいですか?

代わりに次のようなものを取得したい:

POST:<QueryDict: {u'json_data': [{u'id': [u'1']}, {u'id': [u'2']}, {u'id': [u'3']}]},
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'], u'type': [u'clone']>

これにより、QueryDictに辞書としてアクセスし、json_dataをリストとして取得して、特定の順序で処理できるようになります。おそらく、リストの順序でそれらを反復処理するだけです。何かのようなもの:

ret = request.POST
for item in ret['json_data']:
    process(item['id'])

実際、process()に入る値は、単なる数値(1、2、3など)ではなく、キーと値のペアの別のディクショナリである可能性があります。

Javascript:

var test = [{"id": 1},{"id": 2},{"id": 3}];
$.post(
    "/insert_tc",
    {
      json_data: test,
      "type": 'clone',
      "csrfmiddlewaretoken": $csrf_token
    },  
    function(json) {
        //CALLBACK
    },
    "json"
);  

views.py:

def insert_tc(request):
    if request.method == 'POST':       
    ret = request.POST
    type = ret['type']
    list = ret.getlist(ret)

しかし、リストは空を返します[]

simplejsonのダンプ、ロード、アイテム、getメソッドを試しましたが、どれも役に立ちませんでした。

jQuery.param(obj、true)も試しましたが、それは私が望んでいることではありません(多少近いですが)。

AJAXを介して複合データ構造をDjango<->JSとの間でやり取りするための別の/より良い方法はありますか?

4

2 に答える 2

14

JSON.stringify()を使用してJSONを文字列化する必要があります。これにより、JSONオブジェクトが文字列形式に変換されるため、もう一方の端で正しく解析できます。もう一方の端では、json.loads()を使用してオブジェクトを「文字列化解除」する必要があります。

javascript

var test = [{"id": 1},{"id": 2},{"id": 3}];
$.post(
    "/insert_tc",
    {
      json_data: JSON.stringify(test),
      "type": 'clone',
      "csrfmiddlewaretoken": $csrf_token
    },  
    function(json) {
        //CALLBACK
    },
    "json"
);  

表示

import json
def insert_tc(request):
    if request.method == 'POST':       
        ret = request.POST
        type = ret['type']
        list = json.loads(ret['json_data'])
于 2014-05-07T04:33:55.770 に答える
7

これは実際にはdjangoではなくjQueryであり、奇妙です。変数にはJSONは含まれていませtestんが、実際のJSオブジェクトが含まれています。jQueryは、それ自体が最もよく知られている理由により、投稿する前にこれを非常に奇妙な形式に解析するため、結果が得られます。代わりにこれを行った場合(全体の引用符に注意してください):

var test = '[{"id": 1},{"id": 2},{"id": 3}]';

期待するQueryDictに非常に近いことがわかります。次に行う必要があるのは、を呼び出すことだけですjson.loads(ret['json_data'])

また、私には理解できない理由があります。jQueryには、オブジェクトの配列をJSONに変換する機能は含まれていません。そのためのプラグインまたは別のライブラリを見つける必要があります。

于 2012-04-05T22:08:35.493 に答える