JavaScript/JSON/parse

カテゴリ:Book:JavaScript#JSON/parse%20

parse() は、JSON 文字列を解析して JavaScript 値またはオブジェクトを生成するメソッドです。オプションの reviver 関数を使用して、解析結果に対して変換処理を行うことができます[1]

構文

JSON.parse(text[, reviver])
  • text: 解析する JSON 文字列。
  • reviver (オプション): 関数。各キーと値のペアを処理し、値を変換します。

戻り値

指定された JSON 文字列に対応する JavaScript 値を返します。JSON 文字列が有効な JSON 形式でない場合は SyntaxError が発生します。

基本的な使用方法

以下のプログラムは、parse() の基本的な使用方法を示しています。

// 単純なJSON文字列を解析
const json = '{"result":true, "count":42}';
const obj = JSON.parse(json);

console.log(obj.result); // true
console.log(obj.count); // 42

// 配列を含むJSON文字列を解析
const jsonArray = '{"name":"商品リスト", "items":["りんご", "バナナ", "オレンジ"]}';
const data = JSON.parse(jsonArray);

console.log(data.name); // "商品リスト"
console.log(data.items[1]); // "バナナ"
console.log(data.items.length); // 3

このプログラムでは、parse() を使用して JSON 文字列を JavaScript オブジェクトに変換しています。変換後のオブジェクトのプロパティにアクセスできます。

reviverパラメータの使用

以下のプログラムは、reviver 関数を使用して解析結果をカスタマイズする方法を示しています。

// 日付文字列をDateオブジェクトに変換するreviver関数
const jsonWithDates = '{"name":"会議", "scheduled":"2023-05-15T14:30:00.000Z", "participants":["太郎", "花子"]}';

const meeting = JSON.parse(jsonWithDates, (key, value) => {
  // 値が日付形式の文字列の場合、Dateオブジェクトに変換
  if (key === "scheduled" && typeof value === "string") {
    return new Date(value);
  }
  return value;
});

console.log(meeting.name); // "会議"
console.log(meeting.scheduled instanceof Date); // true
console.log(meeting.scheduled.toLocaleString()); // ローカルタイムゾーンでフォーマットされた日付と時刻

// 特定の条件を満たす値を変換するreviver関数
const jsonWithNumbers = '{"values":[1, 2, 3, 4, 5], "threshold":3}';

const data = JSON.parse(jsonWithNumbers, (key, value) => {
  // 数値で、しきい値より大きい場合は2倍にする
  if (typeof value === "number" && key !== "threshold" && value > 3) {
    return value * 2;
  }
  return value;
});

console.log(data.values); // [1, 2, 3, 8, 10]
console.log(data.threshold); // 3

このプログラムでは、reviver 関数を使用して日付文字列を Date オブジェクトに変換したり、特定の条件を満たす数値を変換したりしています。reviver 関数は、解析されたオブジェクトのすべてのキーと値のペアに対して呼び出されます。

エラー処理

以下のプログラムは、無効な JSON 文字列を解析しようとした場合のエラー処理を示しています。

// 無効なJSON文字列
const invalidJson = '{"name":"テスト", "value":42,}'; // 末尾にカンマがある

try {
  const obj = JSON.parse(invalidJson);
  console.log(obj);
} catch (error) {
  console.error("JSONの解析エラー:", error.message);
  // "JSONの解析エラー: Unexpected token } in JSON at position 27"
}

// 安全にJSONを解析する関数
function safeJSONParse(text, defaultValue = null) {
  try {
    return JSON.parse(text);
  } catch (error) {
    console.warn("JSONの解析に失敗しました:", error.message);
    return defaultValue;
  }
}

const result = safeJSONParse(invalidJson, { error: true });
console.log(result); // { error: true }

このプログラムでは、無効な JSON 文字列を解析しようとした場合に SyntaxError が発生することを示しています。また、エラーを適切に処理するために try...catch ブロックを使用する方法と、安全に JSON を解析するためのヘルパー関数を実装しています。

注意点

  • JSON構文: JSON は JavaScript の構文に似ていますが、すべての JavaScript の構文をサポートしているわけではありません。例えば、末尾のカンマ、コメント、undefined はサポートされていません。
  • reviverの処理順序: reviver 関数は、オブジェクトの最も深い部分から呼び出され、徐々に上位レベルに移動します。
  • セキュリティ: 信頼できないソースからの JSON 文字列を解析する場合は、適切な検証を行い、try...catch ブロックを使用してエラーを処理するべきです。
  • 大きな整数: 非常に大きな整数値は精度が失われる可能性があります。
  • 日付の扱い: JSON は日付型をネイティブにサポートしていないため、reviver 関数を使用して日付文字列を Date オブジェクトに変換する必要があります。

脚註

  1. このメソッドは、サーバーからのレスポンスデータの処理や、JSON 形式で保存されたデータの読み込みに頻繁に使用されます。

外部リンク

カテゴリ:Book:JavaScript#JSON/parse%20 カテゴリ:JavaScript
カテゴリ:Book:JavaScript カテゴリ:JavaScript カテゴリ:Pages using the JsonConfig extension