2011-11-28 10 views
9

Ho un problema su urlencode in python 2.7:Perché non riesco a utilizzare urlencode per codificare i dati in formato 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 

risposta

13

urlencode può codificare un dict, ma non una stringa. L'output di json.dumps è una stringa.

A seconda di cosa output che si desidera, o non fanno codificare il dict in JSON:

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

o avvolgere il tutto in un 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' 

o utilizzare quote_plus() invece (urlencode utilizza quote_plus per le chiavi e i valori):

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

Nota che 'quote_plus()' trasformerà i tuoi spazi in '+'. Quando si ha a che fare con JSON si potrebbe desiderare di mantenerli come '% 20', usare' quote() 'per quello – neric

2

json.dumps() restituisce una stringa.

urllib.urlencode() prevede una query nel formato di un oggetto di mappatura o tuple. Si noti che non si aspetta una stringa.

Si passa il primo come parametro per il secondo, con conseguente errore.

1

librerie di importazione

import request 
import json 

spec è un oggetto dizionario dizionario

spec = {...} 

convertito oggetto JSON

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

e, infine, fanno richiesta con il parametro spec in formato JSON

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

analizza risposta ...

+0

Non è consigliabile semplicemente incollare del codice senza spiegarlo. – miq

+0

scusate, "las prisas" o velocità –

Problemi correlati