Maneira correta de capturar exceção do JSON.parse


260

Estou usando JSON.parseuma resposta que às vezes contém uma resposta 404. Nos casos em que retorna 404, existe uma maneira de capturar uma exceção e, em seguida, executar outro 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;
});

3
A resposta 404 está relacionada XMLHttpRequest, não a JSON.parsesi mesma. Se você me mostrar o trecho de código, talvez eu possa ajudá-lo.
Ming-Tang

data = JSON.parse (resposta, função (chave, valor) {var type; if (value && typeof value === 'objeto') {type = value.type; if (typeof type === 'string' && typeof window [type] === 'function') {return new (window [type]) (value);}} retorna valor;
prostock

i postar algo em um iframe, em seguida, ler novamente o conteúdo do iframe com parse json ... por isso às vezes não é uma string JSON
ProStock

Respostas:


419

Eu postei algo em um iframe e depois li novamente o conteúdo do iframe com json parse ... então, às vezes, não é uma string json

Tente o seguinte:

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

12
Se o bloco try contiver mais instruções, você poderá identificar a exceção por e.name == "SyntaxError", desde que você não tenha uma avaliação.
user1158559

1
E se a resposta for indefinida?
vini

12

Podemos verificar o erro e o statusCode 404 e usá-lo try {} catch (err) {}.

Você pode tentar isso:

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

Consulte Mais informação :


5

Eu sou bastante novo em Javascript. Mas é isso que eu entendi: JSON.parse()retorna SyntaxErrorexceções quando JSON inválido é fornecido como seu primeiro parâmetro . Assim. Seria melhor capturar essa exceção da seguinte forma:

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

A razão pela qual tornei as palavras "primeiro parâmetro" em negrito é que JSON.parse()assume uma função reviver como seu segundo parâmetro.


1
Eu não entendo o seu final se / else. Se verdadeiro ou falso, o mesmo código é executado:console.err(objError);
HoldOffHunger

Apenas retorna objError, nomeie como SyntaxError, em vez da parte do erro real.
Toshihiko

2
Mais uma coisa. Ele deve ser: console.error()nãoconsole.err()
k.vincent

-2

Você pode tentar isso:

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

-5

Essa promessa não será resolvida se o argumento JSON.parse () não puder ser analisado em um objeto JSON.

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

2
Mas isso não capturar a exceção lançada peloJSON.parse
realappie

Tudo que você precisa mudar para que isso seja válido é trocar JSON.parse(...) para ()=>JSON.parse(...).
John
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.