Coś jak:
var jsonString = '{ "Id": 1, "Name": "Coke" }';
//should be true
IsJsonString(jsonString);
//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")
Rozwiązanie nie powinno zawierać try / catch. Niektórzy z nas włączają opcję „zepsuć na wszystkich błędach” i nie podoba im się to, że debugger łamie te nieprawidłowe łańcuchy JSON.
javascript
json
Chi Chan
źródło
źródło
try
?Odpowiedzi:
Najpierw komentarz. Pytanie dotyczyło nieużywania
try/catch
.Jeśli nie masz nic przeciwko, aby z niego skorzystać, przeczytaj odpowiedź poniżej. Tutaj po prostu sprawdzamy
JSON
ciąg za pomocą wyrażenia regularnego i będzie on działał w większości przypadków, nie we wszystkich przypadkach.Rozejrzyj się po linii 450 w https://github.com/douglascrockford/JSON-js/blob/master/json2.js
Istnieje wyrażenie regularne, które sprawdza poprawność JSON, coś w stylu:
EDYCJA : Nowa wersja json2.js umożliwia bardziej zaawansowane parsowanie niż powyżej, ale wciąż opiera się na regexp replace (z komentarza @Mrchief )
źródło
Użyj parsera JSON, takiego jak
JSON.parse
:źródło
JSON.parse("false")
ocenia również na fałsz .Wiem, że spóźniłem się na to pytanie o 3 lata, ale miałem ochotę się wtrącić.
Chociaż rozwiązanie Gumbo działa świetnie, nie obsługuje kilku przypadków, w których nie zgłoszono żadnego wyjątku
JSON.parse({something that isn't JSON})
Wolę także zwrócić przeanalizowany JSON w tym samym czasie, aby kod wywołujący nie musiał wywoływać
JSON.parse(jsonString)
się po raz drugi.To wydaje się działać dobrze dla moich potrzeb:
źródło
o && o !== null
jest zbyteczny.undefined
, niefalse
dlatego , żefalse
jest prawidłowym łańcuchem json i nie ma możliwości rozróżnienia międzytryParseJSON("false")
itryParseJSON("garbage")
Zastosowanie:
isJSON({})
będziefalse
,isJSON('{}')
będzietrue
.Aby sprawdzić, czy coś jest
Array
lubObject
( przeanalizowany JSON):Zastosowanie:
isAO({})
będzietrue
,isAO('{}')
będziefalse
.źródło
null
pomyślnie przejdzie to sprawdzenie.return !!(JSON.parse(str) && str);
powinien blokować wartości zerowe. Zaktualizuję odpowiedź za pomocą tego kodu.parse()
testu, powodując WTF.Oto mój działający kod:
źródło
typeof str === 'string'
Użyłem bardzo prostej metody, aby sprawdzić ciąg znaków, czy jest to poprawny JSON, czy nie.
Wynik z prawidłowym łańcuchem JSON:
Wynik z prostym ciągiem;
Wynik z obiektem:
Wynik z wejściem zerowym:
Ostatni zwraca false, ponieważ typ zmiennych zerowych to object.
Działa to za każdym razem. :)
źródło
null
zwróci false. Ale „fałszywe” wejście jest prawidłowym łańcuchem JSON. Zostanie to przeanalizowaneboolean (false)
. Teraz modyfikuję kod, aby był bardziej dokładny.W prototypeJS mamy metodę isJSON . Możesz tego spróbować. Nawet Json może pomóc.
źródło
"{ foo: 42 }".isJSON()
? Jeślifalse
, jak zakładam (wynik powinien być zgodny z funkcją, którą dokumentuje), to dobre pytanie brzmi: dlaczego jest fałszywe?{ foo: 42 }
wydaje się być całkowicie poprawnym JSON.Z
String.isJSON
definicji szkieletu prototypów tutajwięc jest to wersja, której można użyć, przekazując obiekt łańcuchowy
źródło
Użyłem JQuery do parsowania ciągów JSON i użyłem instrukcji trycatch do obsługi wyjątków, ale rzucanie wyjątków dla nieparsowalnych ciągów spowolniło mój kod, więc użyłem prostej Regex, aby sprawdzić ciąg, czy jest to możliwy ciąg JSON, czy nie, bez przechodzenia w pióro sprawdzając jego składnię, użyłem normalnego sposobu, parsując ciąg za pomocą JQuery:
źródło
Może przyda się:
wynik:
IE7: ciąg , obiekt, ciąg, ciąg
CHROM: obiekt, obiekt, ciąg, ciąg
źródło
Myślę, że wiem, dlaczego chcesz tego uniknąć. Ale może spróbuj i złap! == spróbuj i złap. ; o) Przyszło mi to na myśl:
Możesz więc również wyczyścić obiekt JSON, np .:
Ponieważ jest to możliwie najbardziej enkapsulowane, nie może ulec awarii po błędzie.
źródło
Oto także wersja maszynopisu:
źródło
źródło
Wnioskuję z komentarza otwierającego, że przypadek użycia określa, czy odpowiedzią jest HTML, czy JSON. W takim przypadku, kiedy to zrobisz odbierać JSON, prawdopodobnie powinno być analizowania go i obsługi nieprawidłową JSON w pewnym momencie w kodzie tak. Poza tym, wyobrażam sobie, że chciałbyś być informowany przez swoją przeglądarkę, jeśli JSON powinien się spodziewać, ale otrzyma niepoprawny JSON (podobnie jak użytkownicy przez proxy jakiegoś znaczącego komunikatu o błędzie)!
Wykonanie pełnego wyrażenia regularnego dla JSON jest zatem niepotrzebne (tak jak byłoby - z mojego doświadczenia - w większości przypadków użycia). Prawdopodobnie lepiej byłoby użyć czegoś takiego:
powinno to zaoszczędzić Ci konieczności obsługi wyjątkowego kodu innego niż JSON i jednoczesnego dbania o duff json.
źródło
mam nadzieję, że to również dla ciebie działa
źródło
Jeśli występują błędy, zwróć false.
Jeśli nie ma błędów, zwróć dane JSON
źródło
Możesz użyć javascript eval () aby sprawdzić, czy jest poprawna.
na przykład
Alternatywnie możesz użyć
JSON.parse
funkcji z json.org :Mam nadzieję że to pomoże.
OSTRZEŻENIE :
eval()
jest niebezpieczne, jeśli ktoś doda złośliwy kod JS, ponieważ go wykona. Upewnij się, że łańcuch JSON jest godny zaufania , tzn. Otrzymałeś go z zaufanego źródła.Edytuj Dla mojego pierwszego rozwiązania, zaleca się to zrobić.
Aby zagwarantować json-ness. Jeśli
jsonString
nie jest to czysty JSON, eval zgłosi wyjątek.źródło
Och, zdecydowanie możesz użyć try catch, aby sprawdzić, czy jest to poprawny JSON
Testowany na Firfox Quantom 60.0.1
użyj funkcji wewnątrz funkcji, aby przetestować JSON i użyj tego wyjścia do sprawdzenia poprawności łańcucha. słyszy przykład.
źródło
Funkcja
IsJsonString(str)
, która używaJSON.parse(str)
, nie działa w moim przypadku.Próbowałem sprawdzić poprawność danych wyjściowych Json z GraphiQL , zawsze zwracają wartość false. Na szczęście isJSON działa lepiej:
Przykładowe dane wyjściowe:
źródło
Dla osób, które lubią konwencję .Net funkcji „try”, które zwracają wartość logiczną i obsługują parametr byref zawierający wynik. Jeśli nie potrzebujesz parametru out, możesz go pominąć i po prostu użyć wartości zwracanej.
StringTests.js
StringUtils.js
ObjectUtils.js
źródło
Bardzo prosty kod jednowierszowy (ale podejście Hacky)
źródło