2014-10-07 12 views
36

W języku Ruby, czy istnieje sposób sprawdzenia, czy ciąg jest poprawny json przed próbą analizowania go?Sprawdzanie, czy łańcuch jest poprawny json przed próbą analizowania go?

Na przykład uzyskanie niektórych informacji z innych adresów URL, czasami zwraca json, czasami może zwrócić śmieci, które nie jest prawidłową odpowiedzią.

Mój kod:

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

Jestem prawie pewien, że parsowanie to jedyny sposób, aby się upewnić na pewno, że jest ważny. Dlaczego nie przeanalizować go i obsłużyć błąd parsowania informujący, że jest on nieprawidłowy? –

+3

na przykład w ten sposób 'JSON.parse (string) rescue zero' – gotva

+1

Teoretycznie powinien istnieć sposób. Parsowanie ciągu powoduje, że informacje są odpowiednio silniejsze niż wiedza, czy jest on parsable, czy nie. W terminologii Chomsky'ego, dotyczącej języka naturalnego, rozróżnienie to odpowiada silnej i słabej zdolności generacyjnej. Co jednak jest złego w naprawianiu błędu, tak jak w komentarzach powyżej? – sawa

Odpowiedz

15

można zanalizować to w ten sposób

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

Należy pamiętać, że może istnieć "TypeError", jeśli pod będzie coś, co nie może być niejawnie konwertowane na ciąg (np. Zero) – Leaf

39

Można utworzyć metodę, aby wykonać sprawdzenie:

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

uratowanie Wyjątkiem jest niebezpieczne. Powinno być używane tylko wtedy, gdy jest to absolutnie konieczne. Zamiast tego uratuj kilka wyjątków, takich jak: ratowanie TypeError, JSON :: ParserError, itp. – Houen

+0

Hej Thanx Houen. Zaktualizowany kod –

+1

nie trzeba używać "rozpocząć". def - ratunek - koniec powinien zadziałać –

3

myślę parse_json powinien powrócić nil jeśli jest nieważny i nie powinien generować błędu.

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

unless json = parse_json string 
    parse_a_different_way 
end 
+1

Ponieważ jest ładniejsza ... w rzeczywistości, rozważam otwarcie JSON i stworzenie metody o nazwie parse_without_error. – stevo999999

+0

Należy zauważyć, że 'null' i' false' są również poprawnymi JSON. 'JSON.parse' zwraca' nil' i 'false', które będą traktowane jako błąd parsowania w powyższym kodzie. –

Powiązane problemy