Comprobar si una cadena es una cadena JSON válida en JavaScript
Este artículo enseñará cómo verificar si una cadena determinada es una cadena de notación de objetos JSON o JavaScript válida sin usar try...catch
en JavaScript. Comencemos con la definición de cadena JSON y cómo nos ayuda a facilitar nuestro flujo de trabajo.
JSON es un formato de texto independiente del idioma que se utiliza para estructurar datos de forma muy similar a XML; puede consistir en cadenas, números int, float, etc., objetos booleanos, matrices u objetos Java (par clave-valor) encerrados entre corchetes
Diferencia entre objetos JSON y Javascript
Así es como se ve el objeto en JavaScript:
object = {
name: 'Haseeb',
age: 31,
city: 'New York',
male: true
}
Cuando ese objeto se guarda en formato JSON, se ve así:
{"name":" Haseeb ", "age":31, "city":"New York", "male":true}
Cuando recuperamos el objeto del archivo de texto, se convierte al formato de cadena JSON:
{ 'name': ' Haseeb ', 'age': 31, 'city': 'New York', 'male': true }
Podemos ver cómo el formato JSON es legible por humanos y más fácil de manipular para los lenguajes.
Tiene varias ventajas además de eso; JSON, además de ser fácil de leer y escribir, puede integrarse con todos los lenguajes, y el análisis sintáctico ahora se puede usar convenientemente debido a su estructura detallada.
JSON se usa comúnmente para interfaces de programación de aplicaciones (API), ya que se usa principalmente para transferir datos hacia y desde un servidor a una aplicación web o móvil y viceversa.
Al usar la función de análisis de JSON, ahora podemos crear objetos a partir de una cadena JSON, aquí hay un ejemplo de cómo se hace:
string = '{"name":"John", "age":31, "city":"New York", "male":true}';
object = JSON.parse(string);
console.log(object);
Producción :
{
name: 'John',
age: 31,
city: 'New York',
male: true
}
Como era de esperar, la función de análisis recorta todo hasta la clave y el valor del objeto (objeto JSON), razón por la cual la cadena JSON ahora se ha convertido en una convención para transferir datos hacia y desde entre sistemas.
Verifique la validez de la cadena JSON en JavaScript
try...catch
se usa para manejar cualquier error potencial que pueda aparecer en la cadena JSON dada sin detener la ejecución del programa. La cadena podría tener una sintaxis defectuosa, parámetros faltantes o quizás un argumento de división incorrecto.
Así es como podemos verificar la validez de una cadena JSON usando try...catch
:
try {
object = JSON.parse(json);
} catch (error) {
is_json = false;
console.log('Invalid JSON string');
}
Intentemos darle a nuestro código esta cadena:
json = '{"name":"John","city""New York"}';
Producción :
Invalid JSON string
Como podemos observar, nuestro try...catch
no nos dice qué es lo que está mal con la cadena. Simplemente nos dice que existe algún problema.
Para obtener una idea de lo que está mal en la cadena JSON, podemos recurrir a nuestra función personalizada que detecta, si no todos, algunos errores que aparecen en una cadena sin el uso de try...catch
.
isJSON = function(json) {
// Nested Count function only to be used for counting colons and commas
countCharacter =
function(string, character) {
count = 0;
for (var i = 0; i < string.length; i++) {
if (string.charAt(i) == character) { // counting : or ,
count++;
}
}
return count;
}
json = json.trim(); // remove whitespace, start and end spaces
// check starting and ending brackets
if (json.charAt(0) != '{' || json.charAt(json.length - 1) != '}') {
console.log('Brackets {} are not balanced')
return false
}
// else this line will check whether commas(,) are one less than colon(:)
else if (!(countCharacter(json, ':') - 1 == countCharacter(json, ','))) {
console.log('comma or colon are not balanced');
return false;
} else {
json = json.substring(1, json.length - 1); // remove first and last
// brackets
json = json.split(','); // split string into array, and on each index there
// is a key-value pair
// this line iterate the array of key-value pair and check whether key-value
// string has colon in between
for (var i = 0; i < json.length; i++) {
pairs = json[i];
if (pairs.indexOf(':') == -1) { // if colon not exist in b/w
console.log('No colon b/w key and value');
return false;
}
}
}
return true;
};
Usemos las dos cadenas JSON y encontremos sus fallas.
json = ' {"name":"John","city""New York"} ';
json2 = ' {"name":"John","city":"New York" ';
Producción :
comma or colon are not balanced
false
Brackets {}
are not balanced
false
Este código es débil ya que es cierto para algunos casos falsos, por lo que encontramos un enfoque híbrido para fusionar la función superior y el código try...catch
para obtener una respuesta absoluta con algo de depuración.
isJSON = function(json) {
is_json = true; // true at first
// Try-catch and JSON.parse function is used here.
try {
object = JSON.parse(json);
} catch (error) {
is_json = false;
console.log('might be a problem in key or value\'s data type');
}
if (!is_json) {
countCharacter =
function(string, character) {
count = 0;
for (var i = 0; i < string.length; i++) {
if (string.charAt(i) == character) { // counting : or ,
count++;
}
}
return count;
}
json = json.trim(); // remove whitespace, start and end spaces
if (json.charAt(0) != '{' || json.charAt(json.length - 1) != '}') {
console.log('Brackets {} are not balanced')
}
else if (!(countCharacter(json, ':') - 1 == countCharacter(json, ','))) {
console.log('comma or colon are not balanced');
} else {
json =
json.substring(1, json.length - 1); // remove first and last brackets
json = json.split(',');
for (var i = 0; i < json.length; i++) {
pairs = json[i];
if (pairs.indexOf(':') == -1) { // if colon not exist in b/w
console.log('No colon b/w key and value');
}
}
}
}
return is_json;
};
json = ' {"name":"John", "birth":"1986-12-14", "city":5a0} ';
Producción :
might be a problem in key or value's data type
false
Esta función tiene el mismo nivel de depuración que la función anterior, pero esta vez la respuesta será absoluta.