Попередження: Для методів, на які покладається JSON.parse- Масиви та цитати, оточені рядки, також будуть передані (тобто console.log(JSON.parse('[3]'), JSON.parse('"\uD800"')))
Щоб уникнути всіх необ'єктних примітивів JSON (булева, null, масив, число, рядок), я пропоную використовувати наступне:
/* Validate a possible object ie. o = { "a": 2 } */
const isJSONObject = (o) =>
!!o && (typeof o === 'object') && !Array.isArray(o) &&
(() => { try { return Boolean(JSON.stringify(o)); } catch { return false } })()
/* Validate a possible JSON object represented as string ie. s = '{ "a": 3 }' */
function isJSONObjectString(s) {
try {
const o = JSON.parse(s);
return !!o && (typeof o === 'object') && !Array.isArray(o)
} catch {
return false
}
}
Пояснення коду
- !! o - Не хибний (виключає null, який реєструється як typeof 'object')
- (typeof o === 'object') - Виключає булева, число та рядок
- ! Array.isArray (o) - Виключити масиви (які реєструються як typeof 'object')
- спробуйте ... JSON.stringify / JSON.parse - Попросить движок JavaScript визначити, чи дійсний JSON
Чому б не використати відповідь hasJsonStructure ()?
Покладатися на toString()це не дуже гарна ідея. Це пояснюється тим, що різні двигуни JavaScript можуть повертати інше рядкове представлення. Взагалі методи, які покладаються на це, можуть вийти з ладу в різних умовах або можуть згодом зазнати збою, якщо двигун колись змінить результат рядка
Чому ловити виняток - не хак?
Було висунуто, що пошук винятку для визначення дійсності чогось ніколи не є правильним шляхом. Це взагалі гарна порада, але не завжди. У цьому випадку найкращим маршрутом є вилучення винятків, оскільки воно спирається на реалізацію JavaScript механізмом перевірки даних JSON.
Покладаючись на двигун JS, пропонуються наступні переваги:
- Більш ретельне та постійне оновлення в міру зміни специфікацій JSON
- Ймовірно, працює швидше (оскільки це код нижчого рівня)
Коли мені нададуть можливість спиратися на механізм JavaScript, я б запропонував це зробити. Особливо так у цьому випадку. Хоча, можливо, здається, що випробувати виняток хакі, ви дійсно просто обробляєте два можливих стани повернення із зовнішнього методу.
eval()якщо він повернетьсяundefined, це не JSON