Exempel på undantag med JSON i JavaScript
Låt oss säga att JSON med en produkt kommer till oss från den externa världen:
let json = '{"product": "apple", "price": 1000, "amount": 5}';
let product = JSON.parse(json);
alert(product.price * product.amount);
Du vet redan att metoden JSON.parse kommer att
kasta ett undantag om JSON är ogiltig.
Låt oss fånga det här undantaget:
try {
let json = '{"product": "apple", "price": 1000, "amount": 5}';
let product = JSON.parse(json);
alert(product.price * product.amount);
} catch (error) {
// reagera på något sätt på undantaget
}
Det kan dock hända att JSON i sig är giltigt, men inte innehåller de fält vi behöver, till exempel saknas prisfältet:
let json = '{"product": "apple", "amount": 5}'; // inget pris
Låt oss säga att detta också är en exceptionell situation och i sådana fall kasta ett eget användarundantag:
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: 'pris eller antal saknas för produkten'
};
}
} catch (error) {
// reagera på något sätt på undantaget
}
Nu kommer catch-blocket att få två typer
av undantag: antingen är JSON ogiltig överhuvudtaget,
och då blir det ett undantag av typen SyntaxError,
eller så är JSON giltigt, men innehåller inte de
nödvändiga fälten, och då blir det ett undantag av typen
ProductCostError.
Låt oss i catch-blocket fånga dessa
typer av undantag:
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: 'pris eller antal saknas för produkten'
};
}
} catch (error) {
if (error.name == 'SyntaxError') {
alert('Ogiltig JSON för produkt');
} else if (error.name == 'ProductCostError') {
alert('Produkten saknar pris eller antal');
}
}
Låt JSON av följande typ komma till dig:
let json = `[
{
"name": "user1",
"age": 25,
"salary": 1000
},
{
"name": "user2",
"age": 26,
"salary": 2000
},
{
"name": "user3",
"age": 27,
"salary": 3000
}
]`;
Kontrollera denna JSON för allmän giltighet vid tolkning, och efter tolkning, kontrollera att resultatet blir en array, inte något annat. Om resultatet inte är en array - kasta ett undantag.