JavaScriptにおけるJSONの例外処理の例
外部から、ある製品のJSONデータが渡されるとします:
let json = '{"product": "apple", "price": 1000, "amount": 5}';
let product = JSON.parse(json);
alert(product.price * product.amount);
JSONが不正な場合、JSON.parseメソッドが例外をスローすることは既にご存知でしょう。
この例外をキャッチしてみましょう:
try {
let json = '{"product": "apple", "price": 1000, "amount": 5}';
let product = JSON.parse(json);
alert(product.price * product.amount);
} catch (error) {
// 例外への対処
}
しかし、JSON自体は正しい形式であっても、必要なフィールドが含まれていない場合があります。 例えば、価格フィールドがない場合です:
let json = '{"product": "apple", "amount": 5}'; // 価格がない
これも例外的な状況であると言い、このような場合には独自のユーザー定義例外をスローすることにしましょう:
try {
let json = '{"product": "apple", "amount": 5}';
let product = JSON.parse(json);
if (product.price !== undefined && product.amount !== undefined) {
alert(product.price * product.amount);
} else {
throw {
name: 'ProductCostError',
message: '製品に価格または数量がありません'
};
}
} catch (error) {
// 例外への対処
}
これで、catchブロックは2種類の例外を受け取るようになります:
1. JSON全体が不正な場合のSyntaxError型の例外、
2. JSONは正しい形式だが必要なフィールドがない場合のProductCostError型の例外です。
catchブロックで、これらの例外タイプを判別して処理しましょう:
try {
let json = '{"product": "apple", "amount": 5}';
let product = JSON.parse(json);
if (product.price !== undefined && product.amount !== undefined) {
alert(product.price * product.amount);
} else {
throw {
name: 'ProductCostError',
message: '製品に価格または数量がありません'
};
}
} catch (error) {
if (error.name == 'SyntaxError') {
alert('製品のJSONが不正です');
} else if (error.name == 'ProductCostError') {
alert('製品に価格または数量がありません');
}
}
次のような形式のJSONが渡されるとします:
let json = `[
{
"name": "user1",
"age": 25,
"salary": 1000
},
{
"name": "user2",
"age": 26,
"salary": 2000
},
{
"name": "user3",
"age": 27,
"salary": 3000
}
]`;
このJSONをパースする際に全体の正当性を検証し、パース後に結果が配列であるかどうかを確認してください。 結果が配列でない場合は例外をスローしてください。