Dalam Python, apakah ada cara untuk memeriksa apakah string JSON yang valid sebelum mencoba menguraikannya?
Misalnya bekerja dengan hal-hal seperti Facebook Graph API, kadang-kadang mengembalikan JSON, kadang-kadang bisa mengembalikan file gambar.
Dalam Python, apakah ada cara untuk memeriksa apakah string JSON yang valid sebelum mencoba menguraikannya?
Misalnya bekerja dengan hal-hal seperti Facebook Graph API, kadang-kadang mengembalikan JSON, kadang-kadang bisa mengembalikan file gambar.
Jawaban:
Anda dapat mencoba melakukannya json.loads()
, yang akan melempar ValueError
jika string yang Anda berikan tidak dapat diterjemahkan sebagai JSON.
Secara umum, filosofi " Pythonic " untuk situasi seperti ini disebut EAFP , agar Lebih Mudah Meminta Pengampunan daripada Izin .
loads
dalam kecuali klausa?
10
adalah nilai nomor JSON yang valid.
import json
def is_json(myjson):
try:
json_object = json.loads(myjson)
except ValueError as e:
return False
return True
Yang mencetak:
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
Mengonversi string JSON ke kamus Python:
import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo']) #prints bar
mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
Ubah objek python menjadi string JSON:
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
Jika Anda ingin akses ke penguraian level rendah, jangan roll milik Anda sendiri, gunakan perpustakaan yang ada: http://www.json.org/
Tutorial hebat tentang modul 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
Cetakan:
, 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
mampu memeriksa sintaksis, parsing, prittifying, encoding, decoding dan banyak lagi:
del json_object
sekali memvalidasi?
try
. #StopCanaryAbuse
Saya akan mengatakan parsing itu adalah satu-satunya cara Anda dapat benar-benar tahu. Pengecualian akan dimunculkan oleh json.loads()
fungsi python (hampir pasti) jika bukan format yang benar. Namun, tujuan dari contoh Anda, Anda mungkin hanya dapat memeriksa beberapa karakter non-spasi putih pertama ...
Saya tidak terbiasa dengan JSON yang dikirim kembali oleh facebook, tetapi sebagian besar string JSON dari aplikasi web akan mulai dengan kotak terbuka [
atau keriting{
braket . Tidak ada format gambar yang saya tahu mulai dengan karakter itu.
Sebaliknya jika Anda tahu format gambar apa yang mungkin muncul, Anda dapat memeriksa awal string untuk tanda tangan mereka untuk mengidentifikasi gambar, dan menganggap Anda memiliki JSON jika bukan gambar.
Peretasan sederhana lainnya untuk mengidentifikasi grafik, daripada string teks, dalam kasus Anda mencari grafik, hanya untuk menguji karakter non-ASCII dalam beberapa lusin karakter pertama dari string (dengan asumsi JSON adalah ASCII ).
Saya datang dengan solusi generik dan menarik untuk masalah ini:
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
dan Anda dapat menggunakannya seperti ini:
safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
# do something
except
klausa dapat menyembunyikan pengecualian serius. Pengecualian penangkapan harus seketat mungkin.