In Python, c'è un modo per verificare se una stringa è JSON valida prima di provare ad analizzarla?
Ad esempio, lavorando con cose come l'API Graph di Facebook, a volte restituisce JSON, a volte potrebbe restituire un file di immagine.
In Python, c'è un modo per verificare se una stringa è JSON valida prima di provare ad analizzarla?
Ad esempio, lavorando con cose come l'API Graph di Facebook, a volte restituisce JSON, a volte potrebbe restituire un file di immagine.
Risposte:
Puoi provare a farlo json.loads()
, il che genererà un ValueError
se la stringa che passi non può essere decodificata come JSON.
In generale, la filosofia " Pythonic " per questo tipo di situazione si chiama EAFP , perché è più facile chiedere perdono che autorizzazione .
loads
nella clausola tranne?
10
è un valore numerico JSON valido.
import json
def is_json(myjson):
try:
json_object = json.loads(myjson)
except ValueError as e:
return False
return True
Che stampa:
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
print is_json('{"age":100 }') #prints True
print is_json('{"foo":[5,6.8],"foo":"bar"}') #prints True
Convertire una stringa JSON in un dizionario Python:
import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo']) #prints bar
mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
Convertire un oggetto Python in stringa JSON:
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
Se si desidera accedere all'analisi di basso livello, non creare il proprio, utilizzare una libreria esistente: http://www.json.org/
Grande tutorial sul modulo PSON JSON: https://pymotw.com/2/json/
sudo cpan JSON::XS
echo '{"foo":[5,6.8],"foo":"bar" bar}' > myjson.json
json_xs -t none < myjson.json
stampe:
, or } expected while parsing object/hash, at character offset 28 (before "bar}
at /usr/local/bin/json_xs line 183, <STDIN> line 1.
json_xs
è in grado di verificare la sintassi, analizzare, eseguire la codifica, codificare, decodificare e altro:
del json_object
convalidare una volta?
try
. #StopCanaryAbuse
Direi che analizzare è l'unico modo in cui puoi davvero dirlo interamente. L'eccezione sarà sollevata dalla json.loads()
funzione di Python (quasi certamente) se non dal formato corretto. Tuttavia, per gli scopi del tuo esempio puoi probabilmente semplicemente controllare la prima coppia di caratteri non bianchi ...
Non ho familiarità con il JSON che Facebook restituisce, ma la maggior parte delle stringhe JSON delle app Web inizierà con una parentesi quadra [
o riccia aperta {
. Nessun formato di immagine che conosco inizia con quei personaggi.
Al contrario, se sai quali formati di immagine potrebbero essere visualizzati, puoi controllare l'inizio della stringa per le loro firme per identificare le immagini e assumere che tu abbia JSON se non è un'immagine.
Un altro semplice trucco per identificare un elemento grafico, anziché una stringa di testo, nel caso in cui tu stia cercando un elemento grafico, è solo testare caratteri non ASCII nella prima coppia di dozzine di caratteri della stringa (supponendo che JSON sia ASCII ).
Ho trovato una soluzione generica e interessante a questo problema:
class SafeInvocator(object):
def __init__(self, module):
self._module = module
def _safe(self, func):
def inner(*args, **kwargs):
try:
return func(*args, **kwargs)
except:
return None
return inner
def __getattr__(self, item):
obj = getattr(self.module, item)
return self._safe(obj) if hasattr(obj, '__call__') else obj
e puoi usarlo così:
safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
# do something
except
clausola può nascondere qualsiasi eccezione grave. La cattura delle eccezioni deve essere il più restrittiva possibile.