2017-03-17 5 views
1

jQueryのparamがあなたがGETパラメータを通じて転送するネストされたオブジェクトをエンコードすることができます:私はPythonで、このリスト/辞書をデコードするにはどうすればよい

$.param({ a: [ 2, 3, 4 ] }); // "a=2&a=3&a=4" 
// >=1.4: 
$.param({ a: [ 2, 3, 4 ] }); // "a[]=2&a[]=3&a[]=4" 

// <=1.3.2: 
$.param({ a: { b: 1, c: 2 }, d: [ 3, 4, { e: 5 } ] }); 
// "a=[object+Object]&d=3&d=4&d=[object+Object]" 

// >=1.4: 
$.param({ a: { b: 1, c: 2 }, d: [ 3, 4, { e: 5 } ] }); 
// "a[b]=1&a[c]=2&d[]=3&d[]=4&d[2][e]=5" 

を?代わりに、JavascriptとPythonで実装されているネストされたオブジェクトで動作する他のシリアル化がありますか?

+0

JSON :-)それらを避けるために、あなたのデータ構造ビットを変更するには、プロトコルのPythonとJavaScript(および他の言語の多く)の両方のサポートです。 –

+0

1. GETを使用する必要がありますか? POSTの場合は、JSONを使用してください。 2.あなたはdjangoを使っていますか?フラスコ?ボトル?まだ分​​からない? – Udi

+0

@Udiもちろん。そしてフラスコ。 – aitchnyu

答えて

0

あなたはJSONにそれをシリアル化し、データを読み取るためにjsonのpythonモジュールを使用することができます。これは辞書にそれを置きます。

あなたはserialize to JSONをすることができます。 JavaScriptで

var JSON.stringify(your_data); 

PythonでJSONを読み込む:答えhereを使用して

import json  

s = json.loads('{ "a": { "b": 1, "c": 2 }, "d": [ 3, 4, { "e": 5 } ] }') 
s['a'] 
>>>> {'b': 1, 'c': 2} 

s['a']['b'] 
>>>> 1 

フラスコ例、あなたはquery_string引数を変更する必要があるかもしれませんが、それはどのようにそれが希望のアイデアを提供します仕事:

from flask import Flask, request 
from urllib import unquote 
import json 

app = Flask(__name__) 

@app.route('/test', methods=['GET']) 
def process_data(): 
    data = json.loads(unquote(request.query_string.partition('&')[0])) 
    ... 

if __name__ == "__main__": 
    app.run() 

POS TをGETではなくJSONとして指定し、Python/Flaskのrequest.jsonから直接読み取ることができます。 $.param({ a: [ 2, 3, 4 ] })のように、リストの単純な値については、

+0

面白いアイデア、GETパラメータを使ってjsonを転送する。しかし、それはURLで読めなくなり、エスケープするとURLが大きくなりすぎます。 – aitchnyu

+0

Flask(http://flask.pocoo.org/)を見て、GET要求を受け取ってデータを処理するための残りのAPIを設定することができます。 –

+0

@aitchnyu httpを介してデータを受け取る方法を示すFlaskサンプルの概要を追加しました。 –

1

request.args.getlist("a[]")を使用しています。

$.param({d:{foo:123, bar:456}})については

、使用:dicts($.param({outer:{inner:{foo: 123, bar:456}}}))にdictのために働く

def get_jquery_dict(args, key): 
    needle = re.compile(r"^{}\[(\w+)\](.*)$".format(key)) 
    d = MultiDict() 
    for k, v in args.items(multi=True): 
     m = needle.match(k) 
     if not m: 
      continue 
     key = m.group(1) + m.group(2) 
     d.add(key, v) 
    return d 

get_jquery_dict(request.args, 'd') 

dicts( $.param({foo: {bar: [10,20,30]}}))で
# ?outer[inner][foo]=123&outer[inner][bar]=456 
outer = get_jquery_dict(request.args, 'outer') 
inner = get_jquery_dict(outer, 'inner') 

とリスト:辞書用

# ?foo[bar][]=10&foo[bar][]=20&foo[bar][]=30 
foo = get_jquery_dict(request.args, 'foo') 
bar = foo.getlist('bar[]') 

リスト([3, 4, { e: 5 }])で、あなたは広告へようこそですaptのコード上記とget_jquery_list()関数を作成、または

関連する問題