Manera adecuada de detectar excepciones de JSON.parse

260

Estoy usando JSON.parseuna respuesta que a veces contiene una respuesta 404. En los casos en que devuelve 404, ¿hay alguna forma de detectar una excepción y luego ejecutar algún otro código?

data = JSON.parse(response, function (key, value) {
    var type;
    if (value && typeof value === 'object') {
        type = value.type;
        if (typeof type === 'string' && typeof window[type] === 'function') {
            return new(window[type])(value);
        }
    }
    return value;
});
prostock
fuente
3
La respuesta 404 está relacionada XMLHttpRequest, no a JSON.parsesí misma. Si me muestra el código sippet, podría ayudarlo.
Ming-Tang
data = JSON.parse (respuesta, función (clave, valor) {var type; if (value && typeof value === 'object') {type = value.type; if (typeof type === 'string' && typeof window [type] === 'function') {return new (window [type]) (value);}} valor de retorno;
prostock
publico algo en un iframe y luego vuelvo a leer el contenido del iframe con json parse ... así que a veces no es una cadena json
prostock

Respuestas:

419

publico algo en un iframe y luego leo el contenido del iframe con json parse ... así que a veces no es una cadena json

Prueba esto:

if(response) {
    try {
        a = JSON.parse(response);
    } catch(e) {
        alert(e); // error in the above string (in this case, yes)!
    }
}
Ultra instinto
fuente
12
Si el bloque try contiene más declaraciones, puede identificar la excepción por e.name == "SyntaxError", siempre que no tenga una evaluación.
user1158559
1
¿Qué pasa si la respuesta no está definida?
vini
12

Podemos verificar el error y 404 statusCode, y usar try {} catch (err) {}.

Puedes probar esto:

const req = new XMLHttpRequest();
req.onreadystatechange = function() {
    if (req.status == 404) {
        console.log("404");
        return false;
    }

    if (!(req.readyState == 4 && req.status == 200))
        return false;

    const json = (function(raw) {
        try {
            return JSON.parse(raw);
        } catch (err) {
            return false;
        }
    })(req.responseText);

    if (!json)
        return false;

    document.body.innerHTML = "Your city : " + json.city + "<br>Your isp : " + json.org;
};
req.open("GET", "https://ipapi.co/json/", true);
req.send();

Lee mas :

A-312
fuente
5

Soy bastante nuevo en Javascript. Pero esto es lo que entendí: JSON.parse()devuelve SyntaxErrorexcepciones cuando se proporciona un JSON no válido como primer parámetro . Entonces. Sería mejor detectar esa excepción de la siguiente manera:

try {
    let sData = `
        {
            "id": "1",
            "name": "UbuntuGod",
        }
    `;
    console.log(JSON.parse(sData));
} catch (objError) {
    if (objError instanceof SyntaxError) {
        console.error(objError.name);
    } else {
        console.error(objError.message);
    }
}

La razón por la que puse en negrita las palabras "primer parámetro" es que JSON.parse()toma una función reviver como su segundo parámetro.

ubuntugod
fuente
1
No entiendo tu final si / si no. Si es verdadero o falso, se ejecuta el mismo código:console.err(objError);
HoldOffHunger
Simplemente devuelve objError, nombre como SyntaxError, en lugar de la parte de error real.
Toshihiko
2
Una cosa más. Debería ser: console.error()noconsole.err()
k.vincent
-2

Puedes probar esto:

Promise.resolve(JSON.parse(response)).then(json => {
    response = json ;
}).catch(err => {
    response = response
});
vivek java
fuente
-5

Esta promesa no se resolverá si el argumento de JSON.parse () no se puede analizar en un objeto JSON.

Promise.resolve(JSON.parse('{"key":"value"}')).then(json => {
    console.log(json);
}).catch(err => {
    console.log(err);
});
Jason Clay
fuente
2
Pero esto no capta la excepción lanzada por elJSON.parse
realappie
Todo lo que necesita cambiar para que esto sea válido es cambiar JSON.parse(...) por ()=>JSON.parse(...).
John