Comprobar si una cadena es una cadena JSON válida en JavaScript

Tahseen Tauseef 12 octubre 2023
  1. Diferencia entre objetos JSON y Javascript
  2. Verifique la validez de la cadena JSON en JavaScript
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.

Artículo relacionado - JavaScript JSON