JavaScriptにおけるJSONの例外処理の例

外部から、ある製品のJSONデータが渡されるとします:

javascriptlet json = '{"product": "apple", "price": 1000, "amount": 5}';
let product = JSON.parse(json);
alert(product.price * product.amount);

JSONが不正な場合、JSON.parseメソッドが例外をスローすることは既にご存知でしょう。 この例外をキャッチしてみましょう:

javascripttry {
  let json = '{"product": "apple", "price": 1000, "amount": 5}';
  let product = JSON.parse(json);
  alert(product.price * product.amount);
} catch (error) {
  // 例外への対処
}

しかし、JSON自体は正しい形式であっても、必要なフィールドが含まれていない場合があります。 例えば、価格フィールドがない場合です:

javascriptlet json = '{"product": "apple", "amount": 5}'; // 価格がない

これも例外的な状況であると言い、このような場合には独自のユーザー定義例外をスローすることにしましょう:

javascripttry {
  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ブロックで、これらの例外タイプを判別して処理しましょう:

javascripttry {
  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('製品に価格または数量がありません');
  }
}
Задание 1

次のような形式のJSONが渡されるとします:

javascriptlet json = `[
  {
    "name": "user1",
    "age": 25,
    "salary": 1000
  },
  {
    "name": "user2",
    "age": 26,
    "salary": 2000
  },
  {
    "name": "user3",
    "age": 27,
    "salary": 3000
  }
]`;

このJSONをパースする際に全体の正当性を検証し、パース後に結果が配列であるかどうかを確認してください。 結果が配列でない場合は例外をスローしてください。