Python'da, bir dizeyi ayrıştırmaya çalışmadan önce geçerli bir JSON olup olmadığını kontrol etmenin bir yolu var mı?
Örneğin, Facebook Graph API gibi şeylerle çalışırken bazen JSON, bazen de bir görüntü dosyası döndürebilir.
Python'da, bir dizeyi ayrıştırmaya çalışmadan önce geçerli bir JSON olup olmadığını kontrol etmenin bir yolu var mı?
Örneğin, Facebook Graph API gibi şeylerle çalışırken bazen JSON, bazen de bir görüntü dosyası döndürebilir.
Yanıtlar:
Yapmayı deneyebilirsiniz json.loads()
, bu da geçirdiğiniz ValueError
dizenin kodu JSON olarak çözülemezse bir atar .
Genel olarak, " Pythonic durumun bu tür" felsefesi denir EAFP için, mağfiret daha izin isteyin daha kolay .
loads
Dışında belirtilen maddede geçtiğiniz dizeyi döndürmenin nesi yanlış ?
10
geçerli bir JSON numarası değeridir.
import json
def is_json(myjson):
try:
json_object = json.loads(myjson)
except ValueError as e:
return False
return True
Hangi baskılar:
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 dizesini Python sözlüğüne dönüştürme:
import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo']) #prints bar
mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
Python nesnesini JSON dizesine dönüştürme:
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
Düşük düzeyli ayrıştırmaya erişmek istiyorsanız kendi kitaplığınızı döndürmeyin, mevcut bir kitaplığı kullanın: http://www.json.org/
Python JSON modülünde harika öğretici: 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
Baskılar:
, 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
sözdizimi denetimi, ayrıştırma, hassaslaştırma, kodlama, kod çözme ve daha fazlasını yapabilir:
del json_object
kez valide etmemiz gerekir mi?
try
. #StopCanaryAbuse
Ayrıştırmayı gerçekten tamamen anlamanın tek yolu olduğunu söyleyebilirim. İstisna json.loads()
, doğru format değilse python işlevi (neredeyse kesinlikle) tarafından yükseltilecektir . Ancak, örneğinizin amaçları muhtemelen boşluk olmayan karakterlerin ilk çiftini kontrol edebilirsiniz ...
Facebook'un geri gönderdiği JSON'a aşina değilim, ancak web uygulamalarından çoğu JSON dizesi açık bir kare [
veya kıvırcık {
parantez ile başlayacak . Bu karakterlerle başladığımı bildiğim görüntü formatları yok.
Tersine, hangi görüntü formatlarının görünebileceğini biliyorsanız, görüntüleri tanımlamak için dizelerinin başlangıcını imzalarını kontrol edebilir ve görüntü değilse JSON'a sahip olduğunuzu varsayabilirsiniz.
Bir grafik arıyorsanız, bir metin dizesi yerine bir grafiği tanımlamak için başka bir basit saldırı, dizenin ilk birkaç düzine karakterindeki ASCII olmayan karakterleri test etmektir (JSON'un ASCII olduğunu varsayarsak) ).
Bu soruna genel, ilginç bir çözüm buldum:
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
ve şu şekilde kullanabilirsiniz:
safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
# do something
except
madde herhangi bir ciddi istisnayı gizleyebilir. Yakalama istisnaları mümkün olduğunca kısıtlayıcı olmalıdır.