node.jsのいろいろなモジュール44 – YAMLパースライブラリ

2013.09.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

YAMLパーサ

YAML(ヤムル)とは、構造化されたデータやオブジェクトを文字列にシリアライズするためのデータ形式です。
半角スペースのインデントを用いて構造を表現し、配列/ハッシュ/スカラ(単体のデータ)を組み合わせて記述します。

今回紹介するjs-yamlは、YAMLをパースできるライブラリで、バージョン1.2に準拠しています。
このモジュールはコマンドとして使用することもできますし、 
プログラム内でモジュールとして読み込んでAPIを使用することもできます。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.5
  • Node.js : v0.10.8
  • npm : 1.2.23

npmを使用して必要なモジュールをインストールしましょう。

% npm install -g js-yaml

なお、APIとして利用する場合は、グローバルオプションなしでインストールします。

js-yamlを使ってみる

ここにオンラインデモがあるので、結果はひと目でわかりますが、ローカルでも動作を確認してみましょう。
下記のようなYAMLを用意し、js-yamlコマンドを実行してみます。
※デモの簡易版

# http://yaml.org/type/map.html -----------------------------------------------#

map:
  # Unordered set of key: value pairs.
  Block style: !!map
    Clark : Evans
    Ingy  : döt Net
    Oren  : Ben-Kiki
  Flow style: !!map { Clark: Evans, Ingy: döt Net, Oren: Ben-Kiki }

seq:
  # Ordered sequence of nodes
  Block style: !!seq
  - Mercury   # Rotates - no light/dark sides.
  - Venus     # Deadliest. Aptly named.
  - Earth     # Mostly dirt.
  - Mars      # Seems empty.
  - Jupiter   # The king.
  - Saturn    # Pretty.
  - Uranus    # Where the sun hardly shines.
  - Neptune   # Boring. No rings.
  - Pluto     # You call this a planet?
  Flow style: !!seq [ Mercury, Venus, Earth, Mars,      # Rocks
                      Jupiter, Saturn, Uranus, Neptune, # Gas
                      Pluto ]                           # Overrated

# Scalar Types #################################################################
################################################################################

# http://yaml.org/type/bool.html ----------------------------------------------#

bool:
  - true
  - True
  - TRUE
  - false
  - False
  - FALSE

# http://yaml.org/type/float.html ---------------------------------------------#

float:
  canonical: 6.8523015e+5
  exponentioal: 685.230_15e+03
  fixed: 685_230.15
  sexagesimal: 190:20:30.15
  negative infinity: -.inf
  not a number: .NaN

# http://yaml.org/type/int.html -----------------------------------------------#

int:
  canonical: 685230
  decimal: +685_230
  octal: 02472256
  hexadecimal: 0x_0A_74_AE
  binary: 0b1010_0111_0100_1010_1110
  sexagesimal: 190:20:30

# http://yaml.org/type/str.html -----------------------------------------------#

string: abcd

# http://yaml.org/type/timestamp.html -----------------------------------------#

timestamp:
  canonical:        2001-12-15T02:59:43.1Z
  valid iso8601:    2001-12-14t21:59:43.10-05:00
  space separated:  2001-12-14 21:59:43.10 -5
  no time zone (Z): 2001-12-15 2:59:43.10
  date (00:00:00Z): 2002-12-14

上記YAMLをsample.ymlという名前で保存し、js-yamlコマンドを実行してみましょう。
パースされて構造化されたデータがコンソールに表示されます。

% js-yaml sample.yml
{ map:
   { 'Block style':
      { Clark: 'Evans',
        Ingy: 'döt Net',
        Oren: 'Ben-Kiki' },
     'Flow style':
      { Clark: 'Evans',
        Ingy: 'döt Net',
        Oren: 'Ben-Kiki' } },
  seq:
   { 'Block style':
      [ 'Mercury',
        'Venus',
        'Earth',
        'Mars',
        'Jupiter',
        'Saturn',
        'Uranus',
        'Neptune',
        'Pluto' ],
・
・

プログラム中にYAMLをパースしたい場合、js-yamlを通常インストールしてモジュールとして使用します。

% mkdir jsyaml && cd jsyaml
% npm install js-yaml

次のようなapp.jsファイルを記述し、プログラムからsample.ymlを読み込んでみましょう。

//app.js
require('js-yaml');

try {
  var doc = require('/path/your/sample.yml');
  console.log(doc);
} catch (e) {
  console.log(e);
}

プログラムを実行すると、先ほどのコマンド結果と同じように、jsオブジェクトへパースされたYAMLデータが表示されます。

% node app.js

まとめ

最近は設定ファイルとして、JSONだけでなくYAMLをサポートするものも増えてきました。
YAMLを使用したい場合にはこのモジュールがあれば手軽に使用できそうですね。

参考サイトなど