2011-11-28 21 views
9

私は、Python 2.7でのurlencodeについての問題を抱えている:json形式のデータをエンコードするためにurlencodeを使用できないのはなぜですか?

>>> 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 

答えて

13

urlencodeはdictをエンコードできますが、文字列はエンコードできません。 json.dumpsの出力は文字列です。あなたが望むものの出力に応じて

、いずれかのJSONでのdictをコードしない:

>>> 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' 
+0

'quote_plus()'はあなたのスペースを '+'に変換することに注意してください。 JSONを扱うときには、それらを '%20'にしておきたい場合は、' quote() 'を使用してください。 – neric

2

json.dumps()は文字列を返します。

urllib.urlencode()は、マッピングオブジェクトまたはタプルの形式でクエリが必要です。文字列が必要ではないことに注意してください。

最初のパラメータを2番目のパラメータとして渡しているため、エラーが発生します。

1

インポートライブラリ

import request 
import json 

スペックは、JSON

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

に辞書オブジェクト

spec = {...} 

変換辞書オブジェクトであり、最終的にはJSON形式でパラメータの仕様で要求を行う

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

レスポンスを分析してください...

+0

いくつかのコードを説明せずに貼り付けるのは良い方法ではありません。 – miq

+0

申し訳ありませんが、 'las prisas'やスピード –

関連する問題