Trong Python, có cách nào để kiểm tra xem một chuỗi có phải là JSON hợp lệ hay không trước khi thử phân tích chuỗi?
Ví dụ: làm việc với những thứ như API đồ thị của Facebook, đôi khi nó trả về JSON, đôi khi nó có thể trả về một tệp hình ảnh.
Trong Python, có cách nào để kiểm tra xem một chuỗi có phải là JSON hợp lệ hay không trước khi thử phân tích chuỗi?
Ví dụ: làm việc với những thứ như API đồ thị của Facebook, đôi khi nó trả về JSON, đôi khi nó có thể trả về một tệp hình ảnh.
Câu trả lời:
Bạn có thể thử làm json.loads()
, điều này sẽ ném ValueError
nếu chuỗi bạn vượt qua không thể được giải mã thành JSON.
Nói chung, triết lý " Pythonic " cho loại tình huống này được gọi là EAFP , vì dễ xin tha thứ hơn là cho phép .
loads
trong mệnh đề ngoại trừ?
10
là một giá trị số JSON hợp lệ.
import json
def is_json(myjson):
try:
json_object = json.loads(myjson)
except ValueError as e:
return False
return True
Bản in nào:
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
Chuyển đổi một chuỗi JSON thành một từ điển Python:
import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo']) #prints bar
mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
Chuyển đổi một đối tượng python thành chuỗi JSON:
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
Nếu bạn muốn truy cập vào phân tích cú pháp cấp thấp, đừng tự cuộn, hãy sử dụng thư viện hiện có: http://www.json.org/
Hướng dẫn tuyệt vời về mô-đun JSON của 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
Bản in:
, 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
có khả năng kiểm tra cú pháp, phân tích cú pháp, phân tích, mã hóa, giải mã và hơn thế nữa:
del json_object
xác nhận một lần?
try
. #StopCanaryAduse
Tôi muốn nói rằng phân tích cú pháp đó là cách duy nhất bạn thực sự có thể hoàn toàn nói. Ngoại lệ sẽ được nâng lên bởi json.loads()
chức năng của python (gần như chắc chắn) nếu không đúng định dạng. Tuy nhiên, mục đích của ví dụ của bạn có lẽ bạn chỉ cần kiểm tra một vài ký tự không phải khoảng trắng đầu tiên ...
Tôi không quen với JSON mà facebook gửi lại, nhưng hầu hết các chuỗi JSON từ các ứng dụng web sẽ bắt đầu bằng dấu ngoặc vuông [
hoặc mở {
. Không có định dạng hình ảnh tôi biết bắt đầu với những nhân vật.
Ngược lại nếu bạn biết định dạng hình ảnh nào có thể hiển thị, bạn có thể kiểm tra bắt đầu chuỗi ký tự của chúng để xác định hình ảnh và giả sử bạn có JSON nếu đó không phải là hình ảnh.
Một cách hack đơn giản khác để xác định đồ họa, thay vì chuỗi văn bản, trong trường hợp bạn đang tìm đồ họa, chỉ để kiểm tra các ký tự không phải ASCII trong vài chục ký tự đầu tiên của chuỗi (giả sử JSON là ASCII ).
Tôi đã đưa ra một giải pháp chung chung, thú vị cho vấn đề này:
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
và bạn có thể sử dụng nó như vậy:
safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
# do something
except
điều khoản có thể ẩn bất kỳ ngoại lệ nghiêm trọng nào. Bắt ngoại lệ phải càng hạn chế càng tốt.