2012-07-02 15 views
12

Ho una stringa in Python, voglio sapere se è JSON valido.Verificare se una stringa è JSON in python?

json.loads(mystring) genera un errore se la stringa non è JSON ma non voglio rilevare un'eccezione.

voglio qualcosa di simile, ma non funziona:

if type(mysrting) == dict: 
    myStrAfterLoading = json.loads(mystring) 
else: 
    print "invalid json passed" 

Devo catturare quel ValueError per vedere se la mia stringa è JSON?

+7

"... ma io non voglio per cogliere l'eccezione, voglio usarlo se, altrimenti ... "Parafrasando:" Non voglio andare in modo facile, ovvio, voglio farlo in un modo che non funziona ". Senza offesa, solo scherzando! :) –

+0

no, ho avuto un wrapper di eccezioni per tutte le applicazioni. questo dovrebbe catturare errori reali. se posso usare se/else, lo preferisco .. – eligro

+9

Non capisco quell'argomento. Puoi usare try/except inside try/tranne senza problemi. –

risposta

20

Per verificare la stringa è necessario analizzarlo, quindi se è stato selezionato e convertito, richiederebbe letteralmente il doppio. La cattura dell'eccezione è il modo migliore. È interessante notare, è comunque possibile utilizzare un altro, se l'espressione di stile:

try: 
    json_object = json.loads(json_string) 
except ValueError, e: 
    pass # invalid json 
else: 
    pass # valid json 
10

C'è qualche motivo per cui non si vuole intercettare l'eccezione?

Tenete a mente che il test e la cattura di un'eccezione può essere incredibilmente veloce in Python, ed è spesso il modo Pythonic di fare le cose, invece di test per il tipo (in pratica, la tipizzazione fiducia anatra e reagire di conseguenza).

Per mettere la vostra mente un po 'più a suo agio, un'occhiata qui: Python if vs try-except

Se siete ancora preoccupati per la leggibilità, aggiungere un commento al codice di spiegare perché si sta utilizzando try/except ;)

ho lottato con questo approccio me stesso in passato provenienti da un background di Java, ma questo è davvero il modo più semplice di fare questo in Python ... e semplice è meglio che complesso.

+0

come ho detto, avevo wrapper di eccezioni per tutte le applicazioni. Voglio questo per rilevare gli errori urgenti in modo da poterli gestire da 1 posto. usa se altro mi dà più controllo sul codice e per essere sicuro di non averlo fatto eccetto qualcosa, perché un motivo anonimo .. – eligro

+1

poi fai il try/tranne sul blocco minimo di codice possibile. Puoi mantenere il wrapper di eccezioni sul tuo codice e usare try/except come se fosse pensato per essere usato lo stesso. – pcalcao

+5

@eligro: sembra come se pensassi di poter rilevare eccezioni solo in un posto o solo per l'intera applicazione. Questo è un luogo in cui si desidera rilevare un'eccezione specifica perché * si adatta al caso specifico *. –

30

La risposta corretta è: smettere di NON voler intercettare lo ValueError.

sceneggiatura

Esempio Python ritorna un valore booleano se una stringa è valida JSON:

import json 

def is_json(myjson): 
    try: 
     json_object = json.loads(myjson) 
    except ValueError, e: 
     return False 
    return True 

print is_json('{}')    # prints True 
print is_json('{asdf}')   # prints False 
print is_json('{"age":100}')  # prints True 
print is_json('{'age':100 }') # prints False 
print is_json('{"age":100 }') # prints True 
+0

'TypeError: l'oggetto JSON deve essere str, non 'Response'' ottenere questo errore – TomSawyer

+0

non riesce a convalidare su una singola stringa unicode come u'1589649418441381790', qualche idea perché? – lifelogger

-3

perché l'analisi quando è possibile utilizzare tipi come segue:

def is_json(myjson): 
    return type(myjson) == type({}) 

def is_json_arr(myjson): 
    return type(myjson) == type([{}]) 
+0

L'OP vuole verificare se una stringa contiene JSON valido. Una stringa non soddisferà mai 'type (myjson) == type ({})'. – jwodder

Problemi correlati