2012-07-02 27 views
12

Tôi có một chuỗi trong Python, tôi muốn biết nếu nó là JSON hợp lệ.Xác minh xem một chuỗi có phải là JSON trong python không?

json.loads(mystring) sẽ tăng lỗi nếu chuỗi không phải là JSON nhưng tôi không muốn bắt ngoại lệ.

Tôi muốn một cái gì đó như thế này, nhưng nó không hoạt động:

if type(mysrting) == dict: 
    myStrAfterLoading = json.loads(mystring) 
else: 
    print "invalid json passed" 

Tôi có phải bắt mà ValueError để xem nếu chuỗi của tôi là JSON?

+7

"... nhưng tôi không muốn Tôi muốn sử dụng nếu, khác ... "Diễn giải:" Tôi không muốn đi một cách dễ dàng, rõ ràng. Tôi muốn làm điều đó theo cách không hoạt động. " Không có ý định phạm tội, chỉ đùa thôi! :) –

+0

không, tôi đã có một wrapper ngoại lệ cho tất cả các ứng dụng. điều này nên bắt lỗi thực sự. nếu tôi có thể sử dụng nếu/người nào khác, tôi thích nó .. – eligro

+9

Tôi không nhận được đối số đó. Bạn có thể sử dụng try/except bên trong try/except mà không có bất kỳ vấn đề gì. –

Trả lời

20

Để xác minh chuỗi sẽ yêu cầu phân tích cú pháp - vì vậy nếu bạn đã kiểm tra thì chuyển đổi nó sẽ mất gấp đôi thời gian. Bắt ngoại lệ là cách tốt nhất. Điều thú vị là bạn vẫn có thể sử dụng biểu thức kiểu if-else:

try: 
    json_object = json.loads(json_string) 
except ValueError, e: 
    pass # invalid json 
else: 
    pass # valid json 
10

Có lý do nào bạn không muốn loại trừ ngoại lệ không? Hãy nhớ rằng việc thử nghiệm và bắt một ngoại lệ có thể nhanh chóng trong Python, và thường là cách làm việc của Pythonic, thay vì kiểm tra kiểu (về cơ bản, tin vịt gõ và phản ứng tương ứng).

Để đặt tâm trí của bạn nhiều hơn một chút thoải mái, hãy xem ở đây: Python if vs try-except

Nếu bạn vẫn lo lắng về khả năng đọc, thêm nhận xét vào mã để giải thích lý do tại sao bạn đang sử dụng thử/trừ ;)

Tôi đã vật lộn với cách tiếp cận này trong quá khứ đến từ nền Java, nhưng thực sự là cách đơn giản nhất để thực hiện việc này bằng Python ... và đơn giản hơn là phức tạp.

+0

như tôi đã nói, tôi đã có trình bao bọc ngoại lệ cho tất cả ứng dụng. Tôi muốn điều này để nắm bắt các lỗi khẩn cấp để tôi có thể xử lý chúng từ 1 nơi. sử dụng nếu khác cho tôi kiểm soát nhiều hơn về mã và để chắc chắn tôi đã không ngoại trừ một cái gì đó vì lý do anoter .. – eligro

+1

sau đó làm thử/ngoại trừ khối tối thiểu của mã có thể. Bạn có thể giữ wrapper ngoại lệ trên mã của bạn và sử dụng try/except như nó có nghĩa là để được sử dụng tất cả như nhau. – pcalcao

+5

@ google: có vẻ như bạn nghĩ bạn chỉ có thể bắt ngoại lệ ở một nơi hoặc chỉ cho toàn bộ ứng dụng. Đây là một nơi mà bạn muốn bắt một ngoại lệ cụ thể bởi vì nó * phù hợp với usecase cụ thể *. –

30

Câu trả lời đúng là: dừng KHÔNG muốn bắt số ValueError.

Ví dụ Python script trả về một boolean nếu một chuỗi là json hợp lệ:

import json 

def is_json(myjson): 
    try: 
     json_object = json.loads(myjson) 
    except ValueError, 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 
+0

'LoạiError: đối tượng JSON phải là str, không phải 'Response'' nhận được lỗi này – TomSawyer

+0

không xác thực tại chuỗi unicode đơn như u'1589649418441381790', bất kỳ ý tưởng nào tại sao? – lifelogger

-3

tại sao phân tích cú pháp khi bạn có thể sử dụng các loại như sau:

def is_json(myjson): 
    return type(myjson) == type({}) 

def is_json_arr(myjson): 
    return type(myjson) == type([{}]) 
+0

OP muốn kiểm tra xem chuỗi có chứa JSON hợp lệ hay không. Một chuỗi sẽ không bao giờ thỏa mãn 'type (myjson) == type ({})'. – jwodder

Các vấn đề liên quan