Modo corretto per rilevare l'eccezione da JSON.parse


260

Sto usando JSON.parseuna risposta che a volte contiene una risposta 404. Nei casi in cui restituisce 404, c'è un modo per catturare un'eccezione e quindi eseguire qualche altro codice?

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;
});

3
La risposta 404 è correlata XMLHttpRequest, non a JSON.parsese stessa. Se mi mostri il codice sippet, potrei essere in grado di aiutarti.
Ming-Tang,

data = JSON.parse (risposta, funzione (chiave, valore) {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

inserisco qualcosa in un iframe e rileggo il contenuto dell'iframe con json parse ... quindi a volte non è una stringa json
prostock

Risposte:


419

inserisco qualcosa in un iframe, quindi rileggo il contenuto dell'iframe con json parse ... quindi a volte non è una stringa json

Prova questo:

if(response) {
    try {
        a = JSON.parse(response);
    } catch(e) {
        alert(e); // error in the above string (in this case, yes)!
    }
}

12
Se il blocco try contiene più istruzioni, puoi identificare l'eccezione con e.name == "SyntaxError", a condizione che tu non abbia una valutazione.
user1158559

1
Cosa succede se la risposta non è definita?
vini,

12

Siamo in grado di controllare l'errore e 404 statusCode e utilizzare try {} catch (err) {}.

Puoi provare questo:

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();

Leggi di più :


5

Sono abbastanza nuovo su Javascript. Ma questo è quello che ho capito: JSON.parse()restituisce SyntaxErroreccezioni quando viene fornito JSON non valido come primo parametro . Così. Sarebbe meglio cogliere tale eccezione come la seguente:

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);
    }
}

Il motivo per cui ho messo in grassetto le parole "primo parametro" è che JSON.parse()prende una funzione reviver come secondo parametro.


1
Non capisco il tuo finale se / altrimenti. Se vero o falso, viene eseguito lo stesso codice:console.err(objError);
HoldOffHunger

Restituisce semplicemente objError, nome come SyntaxError, invece della parte di errore reale.
Toshihiko,

2
Ancora una cosa. Dovrebbe essere: console.error()noconsole.err()
k.incent

-2

Puoi provare questo:

Promise.resolve(JSON.parse(response)).then(json => {
    response = json ;
}).catch(err => {
    response = response
});

-5

Questa promessa non si risolverà se l'argomento di JSON.parse () non può essere analizzato in un oggetto JSON.

Promise.resolve(JSON.parse('{"key":"value"}')).then(json => {
    console.log(json);
}).catch(err => {
    console.log(err);
});

2
Ma questo non JSON.parse
coglie

Tutto ciò che devi cambiare per essere valido è cambiare JSON.parse(...) per ()=>JSON.parse(...).
Giovanni
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.