Aviso: Para métodos baseados em JSON.parse
- matrizes e strings entre aspas também passarão (isto é console.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
) .
Para evitar todas as primitivas JSON que não são objetos (booleano, nulo, matriz, número, cadeia de caracteres), sugiro o seguinte:
/* 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
}
}
Código Explicação
- !! o - Não é falso (exclui null, que é registrado como tipo de 'objeto')
- (typeof o === 'object') - Exclui booleano, número e string
- ! Array.isArray (o) - Excluir matrizes (que são registradas como tipo de 'objeto')
- try ... JSON.stringify / JSON.parse - Solicita ao mecanismo JavaScript para determinar se JSON válido
Por que não usar a resposta hasJsonStructure ()?
Confiar toString()
não é uma boa ideia. Isso ocorre porque diferentes mecanismos JavaScript podem retornar uma representação de sequência diferente. Em geral, os métodos que dependem disso podem falhar em ambientes diferentes ou podem estar sujeitos a falhas posteriormente, caso o mecanismo altere o resultado da string
Por que pegar uma exceção não é um hack?
Foi levantado que capturar uma exceção para determinar a validade de algo nunca é o caminho certo a seguir. Geralmente, esse é um bom conselho, mas nem sempre. Nesse caso, é provável que a captura de exceções seja a melhor rota, pois depende da implementação do mecanismo JavaScript de validar dados JSON.
Confiar no mecanismo JS oferece as seguintes vantagens:
- Mais completo e atualizado à medida que as especificações JSON mudam
- É provável que corra mais rápido (como é o código de nível inferior)
Quando tiver a oportunidade de usar o mecanismo JavaScript, sugiro fazê-lo. Particularmente nesse caso. Embora possa parecer hacky capturar uma exceção, você está realmente apenas lidando com dois possíveis estados de retorno de um método externo.
eval()
se ele retornarundefined
, então, não é JSON