2013-05-16 36 views
5

Sto provando a convertire una stringa, generata da una richiesta http con urllib3.Converti una stringa in JSON in Python?

Traceback (most recent call last): 
    File "<pyshell#16>", line 1, in <module> 
    data = json.load(data) 
    File "C:\Python27\Lib\json\__init__.py", line 286, in load 
    return loads(fp.read(), 
AttributeError: 'str' object has no attribute 'read' 

>>> import urllib3 
>>> import json 
>>> request = #urllib3.request(method, url, fields=parameters) 
>>> data = request.data 

Ora ... Quando si cerca il seguente, ottengo questo errore ...

>>> json.load(data) # generates the error 
>>> json.load(request.read()) # generates the error 

Esecuzione type(data) e type(data.read()) entrambi restituiscono <type 'str'>

data = '{"subscriber":"0"}}\n' 
+2

Il JSON ha una staffa aggiuntiva. È intenzionale? – Blender

+0

Cosa intendi con "Converti stringa in JSON"? JSON è un formato di stringa. Vuoi convertire JSON negli appropriati oggetti Python nativi (in questo caso un dict che mappa una stringa con un'altra)? O qualche stringa non JSON in una stringa JSON, o qualcosa di diverso? – abarnert

+1

'type (data.read())' non dovrebbe funzionare se 'data' è una stringa. – Blender

risposta

18

json.load carichi da un file- come oggetto O si desidera utilizzare json.loads:

json.loads(data) 

o semplicemente usare json.load in merito alla richiesta, che è un oggetto simile a file:

json.load(request) 

Inoltre, se si utilizza la libreria requests, si può solo fare :

import requests 

json = requests.get(url).json() 
+0

Oppure, invece di girare 'json.load (richiesta. read()) 'in' json.loads (request.read()) ', basta chiamare' json.load (request) '. – abarnert

+0

@abarnert: Grazie, modificato. – Blender

+0

Sto usando la libreria delle richieste, anche se attualmente è commentata. Lavorare su Google Apps Engine che non mi permetteva di eseguirlo e urlfetch aveva problemi con la stessa richiesta GET. Quindi, supportano urllib3 non elaborato ed è quello con cui sto testando. 'json.loads (request.data)' sta funzionando, 'json.load (request)' no. Grazie per l'aiuto. – bnlucas