JavaScript: ツリー構造のデータを扱う (2)
ツリー構造のデータを扱う (1) からの続きです。ツリーデータを JSON で読み書きする
JSON
はツリーオブジェクトをデータファイルなどに保存したり
読んだりするときに便利です。
専用のフォーマットを持つデータファイルに変換するよりも簡単です。
たった 1行のコードで読み書きできます。
JavaScript: JSON シリアライズ
シリアライズとデシリアライズ
JSON の読み書きは、専門用語で シリアライズ (serialize)、 デシリアライズ (deserialize) と呼ぶこともあります。
シリアライズ : データの保存に相当する用語 デシリアライズ : データの読み込みに相当する用語
例: //ツリーノード node を JSON 文字列化する (シリアライズ) const json = JSON.stringify(node); //JSON 文字列をツリーノードのオブジェクトに戻す (デシリアライズ) node = JSON.parse(json);
- サンプル : TestJS_node_json01.html
サンプルツリーノードを作って JSON に変換する。
JSON を読んでツリーノードの探索結果を表示する。
JSON化したテキストは FileAPI
でローカルファイルに保存したり読んだりできます。
テキストファイルを読み書きする話と同じです。
JavaScript ファイル処理 FileAPI
シリアライズできないオブジェクトに注意
ツリーノードの内容によっては JSON シリアライズできない場合があります。 JSON.stringify() の処理でエラーが出ます。
- ノードが循環 (ループ) している場合。
ノードのリンクがループしていて、 子孫のノードが親のノードにつながっている場合。
また、ループしたノードは単純な再帰探索を行うと無限ループになるので注意。 - ノードがクモの巣状につながっている場合。
木のように幹から枝分かれする構造ではなく、 一度分かれた枝がまた 1つの幹に戻るようなリンク構造になっている場合。 親のノードが 1つではなく、2つ以上ある場合に相当します。
いろいろ
ツリーノードを実際にアプリケーションで扱うときに、 Node オブジェクトにシリアライズできないプロパティを一時的につけることも多いです。
例: 1) Node オブジェクトに親のノードの情報を持たせる。 ノードをたどる処理で便利なので付けることがあります。 ただし、循環ノードになるので JSON シリアライズするとエラーに なります。 2) Node オブジェクトに関連づけられた HTML の li 要素を付ける。 アプリケーションの GUI 表示で一時的に付けたプロパティ。 データファイルに保存するオブジェクトではない。
ということで、
Node オブジェクトからシリアライズに必要なプロパティだけ
取り出してシリアライズしたり、デシリアライズで
アプリケーション側で必要な初期化処理をすることもあります。
これらの処理は適当な関数やメソッドに追い出して隠蔽します。
- ツリー構造のデータを扱う (3) に続く