วิธีที่เหมาะสมในการรับการยกเว้นจาก JSON.parse


260

ฉันใช้JSON.parseการตอบกลับที่บางครั้งมีการตอบกลับ 404 ครั้ง ในกรณีที่มันคืนค่า 404 มีวิธีการตรวจสอบข้อยกเว้นแล้วรันรหัสอื่น ๆ ?

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 เกี่ยวข้องกับXMLHttpRequestไม่ใช่JSON.parseตัวเอง หากคุณแสดงโค้ดขนาดเล็กให้ฉันฉันอาจช่วยคุณได้
Ming-Tang

data = JSON.parse (การตอบสนองฟังก์ชั่น (คีย์ค่า) {var type; if (value && มูลค่า typeof === 'object') {type = value.type; if (typeof type === 'string' && typeof window [type] === 'function') {return new (window [type]) (value);}} ค่าส่งคืน
prostock

ฉันโพสต์บางอย่างลงใน iframe แล้วอ่านเนื้อหาของ iframe ด้วย json parse ... ดังนั้นบางครั้งมันไม่ใช่สตริง json
prostock

คำตอบ:


419

ฉันโพสต์บางอย่างลงใน iframe แล้วอ่านเนื้อหาของ iframe ด้วย json parse ... ดังนั้นบางครั้งมันไม่ใช่ json string

ลองสิ่งนี้:

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

12
หากบล็อกการลองมีคำสั่งเพิ่มเติมคุณสามารถระบุข้อยกเว้นโดย e.name == "SyntaxError" โดยที่คุณไม่มี eval
user1158559

1
เกิดอะไรขึ้นถ้าการตอบสนองไม่ได้กำหนด?
Vini

12

เราสามารถตรวจสอบข้อผิดพลาดและ 404 statusCode try {} catch (err) {}และการใช้งาน

คุณสามารถลองสิ่งนี้:

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

อ่านเพิ่มเติม :


5

ฉันค่อนข้างใหม่สำหรับ Javascript แต่นี่คือสิ่งที่ผมเข้าใจ: JSON.parse()ผลตอบแทนSyntaxErrorข้อยกเว้นเมื่อ JSON ที่ไม่ถูกต้องให้เป็นของพารามิเตอร์แรก ดังนั้น. มันจะดีกว่าที่จะจับข้อยกเว้นที่เป็นเช่นนี้:

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

เหตุผลที่ฉันทำให้คำว่า "พารามิเตอร์ตัวแรก" เป็นตัวหนาคือJSON.parse()ฟังก์ชั่น reviver เป็นพารามิเตอร์ตัวที่สอง


1
ฉันไม่เข้าใจรอบชิงหาก / อื่น หากเป็นจริงหรือเท็จรหัสเดียวกันจะทำงาน:console.err(objError);
HoldOffHunger

มันเพิ่งกลับ objError ชื่อเป็น SyntaxError แทนส่วนข้อผิดพลาดจริง
Toshihiko

2
อีกอย่างหนึ่ง มันควรจะเป็น: console.error()ไม่ใช่console.err()
k.vincent

-2

คุณสามารถลองสิ่งนี้:

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

-5

คำสัญญานี้จะไม่แก้ไขหากอาร์กิวเมนต์ของ JSON.parse () ไม่สามารถแยกวิเคราะห์เป็นวัตถุ JSON

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

2
แต่นี่ไม่ได้จับข้อยกเว้นที่เกิดจากJSON.parse
realappie

ทั้งหมดที่คุณต้องเปลี่ยนแปลงนี้จะเป็นที่ถูกต้องคือการเปลี่ยนออกสำหรับJSON.parse(...) ()=>JSON.parse(...)
John
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.