2014-10-07 14 views
36

Trong Ruby, có cách nào để kiểm tra xem một chuỗi có phải là json hợp lệ trước khi cố gắng phân tích cú pháp không?Kiểm tra xem một chuỗi có phải là json hợp lệ trước khi cố phân tích cú pháp không?

Ví dụ lấy một số thông tin từ một số url khác, đôi khi nó trả về json, đôi khi nó có thể trả về rác không phải là phản hồi hợp lệ.

Mã của tôi:

def get_parsed_response(response) 
    parsed_response = JSON.parse(response) 
end 
+7

Tôi chắc chắn phân tích cú pháp đó là cách duy nhất để biết chắc chắn nó hợp lệ. Tại sao không phân tích cú pháp và xử lý lỗi phân tích cú pháp cho bạn biết rằng nó không hợp lệ? –

+3

ví dụ theo cách này 'JSON.parse (chuỗi) giải cứu nil' – gotva

+1

Về mặt lý thuyết, cần có một cách. Phân tích chuỗi một kết quả trong một thông tin mạnh mẽ hơn là biết liệu nó có thể phân tích cú pháp hay không. Trong thuật ngữ của Chomsky, về ngôn ngữ tự nhiên, sự khác biệt này tương ứng với khả năng sinh sản mạnh so với yếu. Tuy nhiên, có vấn đề gì với việc giải cứu lỗi như với các bình luận ở trên? – sawa

Trả lời

15

Bạn có thể phân tích nó theo cách này

begin 
    JSON.parse(string) 
rescue JSON::ParserError => e 
    # do smth 
end 

# or for method get_parsed_response 

def get_parsed_response(response) 
    parsed_response = JSON.parse(response) 
rescue JSON::ParserError => e 
    # do smth 
end 
+1

Xin lưu ý rằng có thể có 'TypeError' nếu dưới sẽ có điều gì đó không thể được chuyển đổi hoàn toàn thành chuỗi (ví dụ: nil) – Leaf

39

Bạn có thể tạo ra một phương pháp để làm việc kiểm tra:

def valid_json?(json) 
    JSON.parse(json) 
    return true 
    rescue JSON::ParserError => e 
    return false 
end 
+6

giải cứu Ngoại lệ là nguy hiểm. Nó chỉ nên được sử dụng nếu thật cần thiết. Thay vào đó, hãy giải cứu một số ngoại lệ, như vậy: giải cứu LoạiError, JSON :: ParserError, v.v. – Houen

+0

Hey Thanx Houen. Đã cập nhật mã –

+1

không cần sử dụng "bắt đầu". def - rescue - end nên làm việc –

3

Tôi nghĩ parse_json nên trở nil nếu nó không hợp lệ và không nên lỗi.

def parse_json string 
    JSON.parse(string) rescue nil 
end 

unless json = parse_json string 
    parse_a_different_way 
end 
+1

Bởi vì nó đẹp hơn ... trên thực tế, tôi đang xem xét việc mở JSON và tạo ra một phương thức được gọi là parse_without_error. – stevo999999

+0

Lưu ý rằng 'null' và' false' cũng là JSON hợp lệ. 'JSON.parse' trả về' nil' và 'false' sẽ được coi là lỗi phân tích cú pháp trong mã ở trên. –

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