No Python, existe uma maneira de verificar se uma string é JSON válida antes de tentar analisá-la?
Por exemplo, trabalhando com coisas como a API do Facebook Graph, às vezes retorna JSON, às vezes pode retornar um arquivo de imagem.
No Python, existe uma maneira de verificar se uma string é JSON válida antes de tentar analisá-la?
Por exemplo, trabalhando com coisas como a API do Facebook Graph, às vezes retorna JSON, às vezes pode retornar um arquivo de imagem.
Respostas:
Você pode tentar fazer isso json.loads()
, que lançará a ValueError
se a sequência que você passar não puder ser decodificada como JSON.
Em geral, a filosofia " pitonica " para esse tipo de situação é chamada EAFP , mais fácil pedir perdão do que permissão .
loads
na cláusula exceto?
10
é um valor de número JSON válido.
import json
def is_json(myjson):
try:
json_object = json.loads(myjson)
except ValueError as e:
return False
return True
Que imprime:
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
Converta uma string JSON em um dicionário Python:
import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo']) #prints bar
mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
Converta um objeto python em string JSON:
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
Se você deseja acessar a análise de baixo nível, não faça o seu próprio, use uma biblioteca existente: http://www.json.org/
Ótimo tutorial sobre o módulo JSON python: 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
Impressões:
, 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
é capaz de verificar, analisar, prittificar, codificar, decodificar e muito mais:
del json_object
validar uma vez?
try
. #StopCanaryAbuse
Eu diria que analisar é a única maneira que você pode realmente dizer inteiramente. A exceção será gerada pela json.loads()
função do python (quase certamente), se não o formato correto. No entanto, para os fins do seu exemplo, você provavelmente pode apenas verificar os dois primeiros caracteres que não são de espaço em branco ...
Eu não estou familiarizado com o JSON que o facebook envia de volta, mas a maioria das strings JSON de aplicativos da web começa com um quadrado [
ou {
colchete aberto . Não conheço nenhum formato de imagem que comece com esses caracteres.
Por outro lado, se você souber quais formatos de imagem podem aparecer, verifique o início da sequência de caracteres para identificar as imagens e assumir que possui JSON, se não for uma imagem.
Outro truque simples para identificar um gráfico, em vez de uma sequência de texto, no caso de você procurar um gráfico, é apenas testar caracteres não ASCII nas primeiras dezenas de caracteres da string (assumindo que o JSON é ASCII )
Eu vim com uma solução genérica e interessante para esse 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 você pode usá-lo assim:
safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
# do something
except
cláusula pode ocultar qualquer exceção séria. A captura de exceções deve ser o mais restritiva possível.