Предупреждение: для методов, полагающихся на JSON.parse
- массивы и заключенные в кавычки строки тоже пройдут (т.е.console.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
)
Чтобы избежать всех необъектных JSON-примитивов (логических, нулевых, массивов, чисел, строк), я предлагаю использовать следующее:
/* 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 - не ложно (исключая ноль, который регистрируется как typeof 'объект')
- (typeof o === 'object') - исключает логическое значение, число и строку
- ! Array.isArray (o) - исключить массивы (которые регистрируются как typeof 'object')
- try ... JSON.stringify / JSON.parse - запрашивает движок JavaScript, чтобы определить, действительно ли JSON
Почему бы не использовать ответ hasJsonStructure ()?
Полагаться на toString()
это не очень хорошая идея. Это потому, что разные движки JavaScript могут возвращать разные строковые представления. В общем, методы, которые полагаются на это, могут потерпеть неудачу в разных средах или могут стать причиной сбоя позже, если механизм когда-либо изменит строковый результат
Почему поймать исключение не взломать?
Было высказано мнение, что поймать исключение для определения достоверности чего-либо никогда нельзя. Это вообще хороший совет, но не всегда. В этом случае перехват исключений, вероятно, является наилучшим маршрутом, поскольку он основан на реализации механизма проверки данных JSON в движке JavaScript.
Опора на движок JS предлагает следующие преимущества:
- Более тщательный и постоянно обновляющийся по мере изменения спецификации JSON
- Вероятно, будет работать быстрее (так как это код нижнего уровня)
Когда мне дали возможность опереться на движок JavaScript, я бы предложил сделать это. Особенно в этом случае. Хотя может показаться хакерским поймать исключение, на самом деле вы просто обрабатываете два возможных состояния возврата из внешнего метода.
eval()
если он возвращаетundefined
тогда, это не JSON