Moyen approprié pour intercepter l'exception de JSON.parse


260

J'utilise JSON.parseune réponse qui contient parfois une réponse 404. Dans les cas où il renvoie 404, existe-t-il un moyen d'attraper une exception, puis d'exécuter un autre code?

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 réponse 404 est liée à XMLHttpRequest, pas JSON.parseelle-même. Si vous me montrez le code sippet, je pourrai peut-être vous aider.
Ming-Tang

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);}} valeur de retour;
prostock

je poste quelque chose dans un iframe puis relis le contenu de l'iframe avec json parse ... donc parfois ce n'est pas une chaîne json
prostock

Réponses:


419

je poste quelque chose dans un iframe puis relis le contenu de l'iframe avec json parse ... donc parfois ce n'est pas une chaîne json

Essaye ça:

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

12
Si le bloc try contient plus d'instructions, vous pouvez identifier l'exception par e.name == "SyntaxError", à condition que vous n'ayez pas d'évaluation.
user1158559

1
Et si la réponse n'est pas définie?
vini

12

Nous pouvons vérifier l'erreur et le statusCode 404, et l'utiliser try {} catch (err) {}.

Vous pouvez essayer ceci:

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

Lire la suite :


5

Je suis assez nouveau sur Javascript. Mais c'est ce que j'ai compris: JSON.parse()retourne des SyntaxErrorexceptions lorsqu'un JSON non valide est fourni comme premier paramètre . Alors. Il serait préférable de saisir cette exception en tant que telle, comme suit:

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 raison pour laquelle j'ai mis les mots "premier paramètre" en gras est que la JSON.parse()fonction reviver est son deuxième paramètre.


1
Je ne comprends pas votre finale si / sinon. Si vrai ou faux, le même code s'exécute:console.err(objError);
HoldOffHunger

Il retourne simplement objError, nom comme SyntaxError, au lieu de la partie d'erreur réelle.
Toshihiko

2
Encore une chose. Cela devrait être: console.error()pasconsole.err()
k.vincent

-2

Vous pouvez essayer ceci:

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

-5

Cette promesse ne sera pas résolue si l'argument de JSON.parse () ne peut pas être analysé dans un objet JSON.

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

2
Mais cela ne prend pas l'exception lancée par leJSON.parse
realappie

Tout ce que vous devez changer pour que cela soit valide, c'est changer JSON.parse(...) pour ()=>JSON.parse(...).
John
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.