2012-07-02 55 views
12

Tengo una cadena en Python, quiero saber si es JSON válida.Verificar si una cadena es JSON en python?

json.loads(mystring) generará un error si la cadena no es JSON, pero no deseo detectar una excepción.

quiero algo así, pero no funciona:

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

¿Tengo que coger ese ValueError para ver si mi cadena es JSON?

+7

"... pero no quiero para atrapar excepciones. Quiero usar si, de lo contrario ... "Parafraseando:" No quiero ir de la manera fácil y obvia. Quiero hacerlo de una manera que no funcione ". Sin ofender, solo bromeando! :) –

+0

no, tenía un envoltorio de excepción para todas las aplicaciones. esto debería atrapar errores reales. si puedo usar if/else, lo prefiero ... – eligro

+9

No entiendo ese argumento. Puedes usar try/except inside try/except sin ningún problema. –

Respuesta

20

Para verificar la cadena, sería necesario analizarla, por lo que si la convertía, tomaría literalmente el doble de tiempo. Coger la excepción es la mejor manera. Curiosamente, todavía se puede utilizar una expresión de estilo else if-:

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

¿Hay alguna razón por la que no se desea capturar la excepción?

Tenga en cuenta que probar y atrapar una excepción puede ser increíblemente rápido en Python, y es a menudo la manera Pythonic de hacer las cosas, en lugar de probar el tipo (básicamente, confiar en pato escribir y reaccionar en consecuencia).

para poner su mente un poco más a gusto, echar un vistazo aquí: Python if vs try-except

Si usted todavía está preocupado por la legibilidad, añade un comentario al código de explicar por qué estás usando try/except ;)

Luché con este enfoque en el pasado provengo de un fondo Java, pero este es de hecho la forma más simple de hacer esto en Python ... y simple es mejor que complejo.

+0

Como dije, tenía un envoltorio de excepción para toda la aplicación. Quiero que esto capte los errores urgentes para que pueda manejarlos desde 1 lugar. use if else da más control sobre el código y para estar seguro de que no he exceptuado algo porque existe otra razón: – eligro

+1

luego haz la prueba/excepto en el bloque mínimo de código posible. Puede mantener el envoltorio de excepción en su código y usar try/except como si estuviera destinado a ser utilizado de todos modos. – pcalcao

+5

@eligro: parece que piensas que solo puedes capturar excepciones en un solo lugar, o solo para toda la aplicación. Este es un lugar donde desea capturar una excepción específica porque * se ajusta al caso de uso específico *. –

30

La respuesta correcta es: dejar de querer atrapar el ValueError.

guión

Ejemplo Python devuelve un booleano si una cadena JSON es válida:

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: el objeto JSON debe ser str, no 'Response'' obtener este error – TomSawyer

+0

no se puede validar en una sola cadena unicode como u'1589649418441381790', alguna idea de por qué? – lifelogger

-3

qué análisis cuando se puede utilizar tipos de la siguiente manera:

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

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

El OP quiere probar si una cadena contiene JSON válido. Una cadena nunca satisfará 'type (myjson) == type ({})'. – jwodder

Cuestiones relacionadas