JSON.parse kural dışı durumunu yakalamanın doğru yolu


260

Ben kullanıyorum JSON.parsebazen 404 yanıtı içeren bir yanıta. 404 döndürdüğü durumlarda, bir istisna yakalamanın ve ardından başka bir kod yürütmenin bir yolu var mı?

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
404 yanıt ile ilgilidir XMLHttpRequestdeğil, JSON.parsekendisi. Bana kod parçasını gösterirseniz, size yardımcı olabilirim.
Ming-Tang

data = JSON.parse (yanıt, işlev (anahtar, değer) {var type; if (value && typeof value === 'object') {type = value.type; if (typeof type === 'dize' && typeof window [type] === 'function') {return new (window [type]) (değer);}} dönüş değeri;
prostock

i iframe içine bir şey göndermek sonra json ayrıştırma ile iframe içeriğini okumak ... bu yüzden bazen bir json dize değil
prostock 17:05

Yanıtlar:


419

i iframe içine bir şey göndermek sonra json ayrıştırma ile iframe içeriğini okumak ... bu yüzden bazen bir json dize değil

Bunu dene:

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

12
Try bloğu daha fazla ifade içeriyorsa, bir değerlendirmeniz yoksa istisnayı e.name == "SyntaxError" ile tanımlayabilirsiniz.
user1158559

1
Yanıt tanımsızsa ne olur?
vini

12

Hata ve 404 statusCode'u kontrol edebilir ve kullanabiliriz try {} catch (err) {}.

Bunu deneyebilirsiniz:

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

Daha fazla oku :


5

Javascript için oldukça yeniyim. Ama bu anladım: geçersiz JSON ilk parametre olarak sağlandığında istisnalar JSON.parse()döndürür . Yani. Bu istisnayı aşağıdaki gibi yakalamak daha iyi olur:SyntaxError

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

"Birinci parametre" kelimelerini kalın yapmamın nedeni JSON.parse(), ikinci parametre olarak reviver işlevini almasıdır.


1
Eğer son halini / başkasını anlamıyorum. True veya false olursa, aynı kod çalışır:console.err(objError);
HoldOffHunger

Sadece gerçek hata kısmı yerine objError, SyntaxError olarak adlandırın.
Toshihiko

2
Bir şey daha var. Olması gereken: console.error()notconsole.err()
k.vincent

-2

Bunu deneyebilirsiniz:

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

-5

JSON.parse () argümanı bir JSON nesnesine ayrıştırılamazsa bu vaat çözümlenmez.

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

2
Ancak bu, atılan istisnayı yakalamazJSON.parse
realappie

Eğer geçerli olması bunun için değiştirmek için gereken tüm dışarı değiştirmektir JSON.parse(...) için ()=>JSON.parse(...).
John
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.