У Python чи існує спосіб перевірити, чи є строка дійсною JSON, перш ніж спробувати її розібрати?
Наприклад, робота з такими речами, як API Graph Graph, іноді вона повертає JSON, іноді може повернути файл зображення.
У Python чи існує спосіб перевірити, чи є строка дійсною JSON, перш ніж спробувати її розібрати?
Наприклад, робота з такими речами, як API Graph Graph, іноді вона повертає JSON, іноді може повернути файл зображення.
Відповіді:
Ви можете спробувати зробити json.loads(), що буде кидати a, ValueErrorякщо рядок, який ви пропускаєте, не може бути декодований як JSON.
Взагалі, філософія " пітонічного " для подібної ситуації називається 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/
Чудовий підручник з модуля 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 здатний перевіряти синтаксис, аналізувати, закріплювати, кодувати, декодувати тощо:
del json_objectколись підтвердити?
try. #StopCanaryAbuse
Я б сказав, що це розбір - це єдиний спосіб, який ви можете реально повністю сказати. Виняток буде підвищено функцією python json.loads()(майже напевно), якщо не правильним форматом. Однак для цілей вашого прикладу ви, ймовірно, можете просто перевірити першу пару символів, які не пробіли ...
Я не знайомий з 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стаття може приховувати будь-який серйозний виняток. Винятки з лову повинні бути максимально обмежуючими.