2014-11-07 12 views
7

Sto provando a leggere un json e ottenere i suoi valori. Ho una cartella con gli archivi JSON, e ho bisogno di aprire tutti gli archivi e ottenere i valori da essi.Python ValueError: nessun oggetto JSON può essere decodificato

Questo è il codice:

# -*- encoding: utf-8 -*- 
from pprint import pprint 
import json 
import os 
def start(): 
    for dirname, dirnames, filenames in os.walk('test'): 
     for filename in filenames: 
      json_file = open(os.path.join(dirname, filename)).read() 
      # json_file = unicode(json_file, 'utf-8') 
      json_data = json.loads(json_file) 
      pprint(json_data) 
      for key, value in json_data.items(): 
       print "KEY : ", key 
       print "VALUE: ", value 
       start() 

Questo è uno del JSON

{ "test" : "Search User 1", 
    "url" : "http://127.0.0.1:8000/api/v1/user/1/?format=json", 
    "status_code" : 200, 
    "method" : "get" 
} 

Ma quando l'eseguo, ottengo questo:

ValueError: No JSON object could be decoded 

Che diavolo sta sbagliato? Ieri stava funzionando esattamente come è ora, o sono pazzo

ho provato in questo modo:

from pprint import pprint 
import json 
import os 
for dirname, dirnames, filenames in os.walk('test'): 
    for filename in filenames: 
     json_file_contents = open(os.path.join(dirname, filename)).read() 
     try: 
      json_data = json.loads(json_file_contents) 
     except ValueError, e: 
      print e 
      print "ERROR" 

Non posso vedere alcun errore '-'

for filename in filenames: 
     with open(os.path.join(dirname,filename)) as fd: 
      json_data = fd.read() 
      print json_data 

In questo modo posso vedere cosa contengono i file json, ma non posso usare ad esempio l'accesso tramite la chiave, come json_data['url']

+0

è necessario rinominare "json_file" a "json_file_contents" o qualcosa di simile. È confusionario.Più importante però: provate: tranne ValueError attorno all'istruzione json.loads e stampate il contenuto reale del file. – deets

+0

È questo il tuo codice attuale? Sto ottenendo un 'IndentationError' sulla riga 'pprint'. – Kevin

+0

cosa è cambiato da ieri? – dm03514

risposta

6

È possibile che il metodo .read() stia spostando il cursore alla fine di t egli file. Prova:

for filename in filenames: 
    with open(os.path.join(dirname,filename)) as fd: 
     json_data = json.load(fd) 

e vedere dove si ottiene.

Questo, ovviamente, presuppone che tu abbia valid JSON, come dimostra il tuo esempio. (Guarda le virgole finali)

+0

non ho capito, cosa è fd? –

+0

Il puntatore del file. Vedi http://effbot.org/zone/python-with-statement.htm –

+0

funziona, ma ora ho una stringa, e non posso accedere ai valori con i tasti –

0

Ho avuto lo stesso problema oggi. Cercando di capire la causa, ho trovato questo problema legato alla json modulo:

http://bugs.python.org/issue18958

Verificare se il file è UTF8 codificato e se è il caso, quindi utilizzare il modulo codecs per aprire e leggere o semplicemente saltare il BOM (byte order mark).

13

Per me è stato un problema di codifica, si può provare a utilizzare Notepad++ per modificare il file .json e cambiare la codifica UTF-8 senza BOM. Un'altra cosa che puoi controllare è se il tuo script JSON è valid

+0

GRAZIE! Salvavita :) –

0

La risposta che suggerisce che .read() stava muovendo il cursore portava a una risoluzione della mia versione del problema. Ho cambiato

print response.read() 
... 
json_data = json.loads(response.read()) 

a

responseStr = response.read() 
print responseStr 
... 
json_data = json.loads(responseStr) 
1

ho risolto questo errore Conversione file JSON in UTF-8 senza BOM. Qui di seguito è un frammento di pitone e url per la conversione

myFile=open(cases2.json, 'r') 
myObject=myFile.read() 
u = myObject.decode('utf-8-sig') 
myObject = u.encode('utf-8') 
myFile.encoding 
myFile.close() 
myData=json.loads(myObject,'utf-8') 
Problemi correlati