В Python есть ли способ проверить, является ли строка допустимым JSON, прежде чем пытаться ее проанализировать?
Например, работая с такими вещами, как Facebook Graph API, иногда он возвращает JSON, иногда он может вернуть файл изображения.
В Python есть ли способ проверить, является ли строка допустимым JSON, прежде чем пытаться ее проанализировать?
Например, работая с такими вещами, как Facebook Graph API, иногда он возвращает JSON, иногда он может вернуть файл изображения.
Ответы:
Вы можете попытаться это сделать json.loads()
, что приведет к выдаче, ValueError
если передаваемая строка не может быть декодирована как JSON.
В общем, философия " Pythonic " для такого рода ситуаций называется EAFP , так как Проще просить прощения, чем разрешения .
loads
в предложении кроме?
10
является допустимым значением числа JSON.
import json
def is_json(myjson):
try:
json_object = json.loads(myjson)
except ValueError as 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
print is_json('{"age":100 }') #prints True
print is_json('{"foo":[5,6.8],"foo":"bar"}') #prints True
Преобразовать строку JSON в словарь Python:
import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo']) #prints bar
mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
Преобразовать объект Python в строку JSON:
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
Если вы хотите получить доступ к низкоуровневому анализу, не катайтесь самостоятельно, используйте существующую библиотеку: http://www.json.org/
Отличное руководство по Python-модулю 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
Печать:
, 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
способен проверять синтаксис, анализировать, prittifying, кодировать, декодировать и многое другое:
del json_object
когда-то проверить?
try
. #StopCanaryAbuse
Я бы сказал, разбор это единственный способ, которым вы можете сказать полностью. Исключение будет вызвано json.loads()
функцией Python (почти наверняка), если не правильный формат. Тем не менее, в целях вашего примера вы можете просто проверить первую пару непробельных символов ...
Я не знаком с JSON, который отправляет Facebook, но большинство строк JSON из веб-приложений начинаются с квадратной [
или фигурной {
скобки. Нет известных мне графических форматов, начинающих с этих символов.
И наоборот, если вы знаете, какие форматы изображений могут отображаться, вы можете проверить начало строки на предмет их подписей для идентификации изображений и предположить, что у вас есть JSON, если это не изображение.
Другой простой способ идентифицировать графику, а не текстовую строку, в случае, если вы ищете графику, это просто проверить не-ASCII-символы в первой паре дюжин символов строки (при условии, что JSON - ASCII ).
Я придумал общее, интересное решение этой проблемы:
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
и вы можете использовать его так:
safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
# do something
except
пункт может скрыть любое серьезное исключение. Ловля исключений должна быть максимально ограничительной.