Синтаксический анализ строки в jQuery $ .param в Python (движок приложения) - PullRequest
1 голос
/ 12 февраля 2011

У меня есть словарь JavaScript, который я хочу передать в приложение Python на движке приложения, поместить в хранилище данных, извлечь из хранилища данных и, наконец, вернуть как JSON.Какой правильный способ сделать это?

Скажем, это выглядит примерно так:

dict = {'box': 'huge',
        'crayons': [{ 'color': 'blue', 'l': 12 },
                    { 'color': 'red', 'l': 2 },
                    { 'color': 'yellow', 'l': 7 }]};

Я сериализую его с помощью jQuery:

data = $.param(dict);

получая что-то вроде:

box=huge&crayons%5B0%5D%5Bcolor%5D=blue&crayons%5B0%5D%5Bl%5D=12&crayons%5B1%5D%5Bcolor%5D=red&crayons%5B1%5D%5Bl%5D=2&crayons%5B2%5D%5Bcolor%5D=yellow&crayons%5B2%5D%5Bl%5D=7

Я отправляю его с помощью $ .ajax в механизм приложений (Python, Flask) и помещаю в хранилище данных в виде сериализованной строки.Позже я хочу десериализовать его в словарь Python и перевести его в JSON, используя simplejson.

Я не знаю, как десериализовать его в словарь Python.

Редактировать: Или, может быть, яя делаю это неправильно и нужно передать словарь в движок приложения по-другому?

Ответы [ 5 ]

3 голосов
/ 13 февраля 2011

Если вы используете $ .param, вы теряете информацию о типе при разборе данных. В вашем примере число 12 становится строкой «12». Также логическое значение true станет строкой 'true'. Это может привести к проблемам при получении данных с сервера.

Если для вас важно сохранить информацию о типе, вы можете захотеть json кодировать объект перед отправкой его в механизм приложений (https://github.com/douglascrockford/JSON-js). Тогда вы можете просто поместить данные прямо в хранилище данных и вернуть их по запросу.

2 голосов
/ 12 февраля 2011

urlparse.parse_qs:

>>> import urlparse
>>> urlparse.parse_qs("box=huge&crayons%5B0%5D%5Bcolor%5D=blue&crayons%5B0%5D%5Bl%5D=12&crayons%5B1%5D%5Bcolor%5D=red&crayons%5B1%5D%5Bl%5D=2&crayons%5B2%5D%5Bcolor%5D=yellow&crayons%5B2%5D%5Bl%5D=7")
{'box': ['huge'],
'crayons[0][color]': ['blue'],
'crayons[0][l]': ['12'],
'crayons[1][color]': ['red'],
'crayons[1][l]': ['2'],
'crayons[2][color]': ['yellow'],
'crayons[2][l]': ['7']}
1 голос
/ 09 июня 2011

Что ж, urlparse.parse_qs довольно хорошо, но если у вас есть вложенные структуры и т. Д., Есть jquery-unparam , который дополнительно проанализирует все эти вложенные объекты для вас. Кажется, до сих пор мне это удавалось.

>>> from jquery_unparam import jquery_unparam
>>> jquery_unparam("a=1&b%5B%5D=2&b%5B%5D=3&b%5B%5D=4&c%5Bd%5D=5")
{'a': '1', 'c': {'d': '5'}, 'b': ['2', '3', '4']}

>>> from urlparse import parse_qs
>>> parse_qs("a=1&b%5B%5D=2&b%5B%5D=3&b%5B%5D=4&c%5Bd%5D=5")
{'a': ['1'], 'b[]': ['2', '3', '4'], 'c[d]': ['5']}
0 голосов
/ 28 июня 2014

Используйте JSON.stringify(dict) для сериализации вашего словаря JavaScript и json.loads(dict_string) для десериализации в словарь Python.

Таким образом, ваш код JavaScript будет выглядеть примерно так:

$.ajax({
    url: '/some/url',
    type: 'post',
    data: { 
        'dict': JSON.stringify(dict) 
    }    
});

... и ваш код Python будет выглядеть примерно так:

import json

from google.appengine.ext import webapp

class MyRequestHandler(webapp.RequestHandler):
    def post(self):
        dict = json.loads(self.request.get('dict'))
0 голосов
/ 12 февраля 2011

json.loads (request.POST)

Это от simplejson и как я это делаю в django.

...