2011-11-28 11 views
9

Tôi có một vấn đề về urlencode trong python 2.7:Tại sao tôi không thể sử dụng urlencode để mã hóa dữ liệu định dạng json?

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

Trả lời

13

urlencode có thể mã hóa dict chứ không phải chuỗi. Đầu ra của json.dumps là một chuỗi.

Tùy thuộc vào những gì bạn muốn đầu ra, hoặc không mã hóa dict trong JSON:

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

hoặc quấn toàn bộ điều trong một dict:

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

hoặc sử dụng quote_plus() thay vì (urlencode sử dụng quote_plus cho khóa và giá trị):

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

Lưu ý rằng 'quote_plus()' sẽ biến đổi không gian của bạn thành '+'. Khi giao dịch với JSON, bạn có thể muốn giữ chúng dưới dạng '% 20', sử dụng' quote() 'cho rằng – neric

2

json.dumps() trả về một chuỗi.

urllib.urlencode() hy vọng một truy vấn ở định dạng của một đối tượng ánh xạ hoặc bộ dữ liệu. Lưu ý rằng nó không mong đợi một chuỗi.

Bạn đang chuyển giá trị đầu tiên làm thông số cho lần thứ hai, dẫn đến lỗi.

1

thư viện import

import request 
import json 

spec là một đối tượng từ điển

spec = {...} 

chuyển đổi đối tượng từ điển để json

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

và cuối cùng là làm theo yêu cầu với tham số đặc tả ở định dạng json

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

phân tích phản hồi ...

+0

Thực tiễn không tốt là chỉ dán một số mã mà không giải thích nó. – miq

+0

xin lỗi, 'las prisas' hoặc tốc độ –