Почему я не могу использовать urlencode для кодирования данных формата json? - PullRequest
10 голосов
/ 28 ноября 2011

У меня проблема с urlencode в python 2.7:

>>> import urllib
>>> import json
>>> urllib.urlencode(json.dumps({'title':"hello world!",'anonymous':False,'needautocategory':True}))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/urllib.py", line 1280, in urlencode
    raise TypeError
TypeError: not a valid non-string sequence or mapping object

Ответы [ 4 ]

16 голосов
/ 28 ноября 2011

urlencode может кодировать диктовку, но не строку. Вывод json.dumps представляет собой строку.

В зависимости от того, какой вывод вы хотите, либо не кодируйте dict в JSON:

>>> urllib.urlencode({'title':"hello world!",'anonymous':False,'needautocategory':True})
'needautocategory=True&anonymous=False&title=hello+world%EF%BC%81'

или оберните все это в диктовку:

>>> urllib.urlencode({'data': json.dumps({'title':"hello world!",'anonymous':False,'needautocategory':True})})
'data=%7B%22needautocategory%22%3A+true%2C+%22anonymous%22%3A+false%2C+%22title%22%3A+%22hello+world%5Cuff01%22%7D'

или используйте quote_plus() вместо (urlencode использует quote_plus для ключей и значений):

>>> urllib.quote_plus(json.dumps({'title':"hello world!",'anonymous':False,'needautocategory':True}))
'%7B%22needautocategory%22%3A+true%2C+%22anonymous%22%3A+false%2C+%22title%22%3A+%22hello+world%5Cuff01%22%7D'
12 голосов
/ 28 ноября 2011

Поскольку urllib.urlencode "преобразует объект сопоставления или последовательность двухэлементных кортежей в строку, закодированную в процентах ..." .Ваша строка ни того, ни другого.

Я думаю, вам нужно urllib.quote или urllib.quote_plus.

2 голосов
/ 20 февраля 2015

импорт библиотек

import request
import json

spec - это объект словаря

spec = {...}

преобразовать объект словаря в json

data = json.dumps(spec, ensure_ascii=False)

и, наконец, выполнить запрос со спецификацией параметра вформат json

response = requests.get(
    'http://localhost:8080/...',
    params={'spec': data}
)

анализ ответа ...

2 голосов
/ 28 ноября 2011

json.dumps() возвращает строку.

urllib.urlencode() ожидает запрос в формате объекта сопоставления или кортежей. Обратите внимание, что он не ожидает строку.

Вы передаете первое в качестве параметра для второго, что приводит к ошибке.

...