Ostrzeżenie: w przypadku metod, na których opierają się JSON.parse- tablice i łańcuchy otoczone cudzysłowami również przejdą (tj.console.log(JSON.parse('[3]'), JSON.parse('"\uD800"')) )
Aby uniknąć wszystkich prymitywów JSON niebędących obiektami (boolean, null, array, number, string), sugeruję użycie następującego:
const isJSONObject = (o) =>
!!o && (typeof o === 'object') && !Array.isArray(o) &&
(() => { try { return Boolean(JSON.stringify(o)); } catch { return false } })()
function isJSONObjectString(s) {
try {
const o = JSON.parse(s);
return !!o && (typeof o === 'object') && !Array.isArray(o)
} catch {
return false
}
}
Objaśnienie kodu
- !! o - Not falsy (wyklucza wartość null, która rejestruje się jako typ 'obiektu')
- (typeof o === 'obiekt') - wyklucza wartość logiczną, liczbę i ciąg
- ! Array.isArray (o) - wyklucza tablice (które rejestrują się jako typ 'obiektu')
- try ... JSON.stringify / JSON.parse - prosi silnik JavaScript o określenie, czy poprawny format JSON
Dlaczego nie skorzystać z odpowiedzi hasJsonStructure ()?
Poleganie na tym toString()nie jest dobrym pomysłem. Dzieje się tak, ponieważ różne silniki JavaScript mogą zwracać inną reprezentację ciągu. Ogólnie rzecz biorąc, metody, które na tym polegają, mogą zawieść w różnych środowiskach lub mogą ulec awarii później, jeśli silnik kiedykolwiek zmieni wynik ciągu
Dlaczego przechwytywanie wyjątku nie jest hakowaniem?
Wychowywano, że złapanie wyjątku w celu określenia ważności czegoś nigdy nie jest właściwą drogą. To generalnie dobra rada, ale nie zawsze. W tym przypadku wychwytywanie wyjątków jest prawdopodobnie najlepszą drogą, ponieważ opiera się na implementacji walidacji danych JSON przez silnik JavaScript.
Poleganie na silniku JS zapewnia następujące korzyści:
- Bardziej szczegółowe i stale aktualizowane wraz ze zmianami specyfikacji JSON
- Prawdopodobnie będzie działać szybciej (ponieważ jest to kod niższego poziomu)
Gdybym miał możliwość oparcia się na silniku JavaScript, radziłbym to zrobić. Szczególnie w tym przypadku. Chociaż wychwycenie wyjątku może wydawać się hackem, tak naprawdę obsługujesz tylko dwa możliwe stany powrotu z metody zewnętrznej.