JSON.parseからの例外をキャッチする適切な方法


260

JSON.parse404応答が含まれる場合がある応答で使用しています。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応答はXMLHttpRequestJSON.parseそれ自体ではなくに関連しています。コードスニペットを見せていただければ、お手伝いできるかもしれません。
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);}}戻り値;
prostock

iframeに何かを投稿し、json解析でiframeのコンテンツを読み戻します...そのため、json文字列ではない場合があります
prostock

回答:


419

iframeに何かを投稿し、json解析でiframeのコンテンツを読み戻します...そのため、json文字列ではない場合があります

これを試して:

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

12
tryブロックにさらにステートメントが含まれている場合、evalがない場合は、e.name == "SyntaxError"で例外を識別できます。
user1158559 2015

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が提供された場合、例外をJSON.parse()返します。そう。次のようにその例外をキャッチする方が良いでしょう: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);
    }
}

「最初のパラメーター」という言葉を太字にしたのはJSON.parse()、2番目のパラメーターとしてリバイバー関数を使用するためです。


1
最終的なif / elseがわかりません。真または偽、同じコードが実行される場合:console.err(objError);
HoldOffHunger

実際のエラー部分ではなく、objError、nameをSyntaxErrorとして返すだけです。
俊彦

2
もう一つ。それは:console.error()notconsole.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(...)
ジョン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.