JSON class

JSON(JavaScript Object Notation)は軽量のデータ交換フォーマットである. 詳しくは www.json.org を参照してほしい.

JSON.x10

X10JSON plham.util.JSON は JSON ファイルを解析し,そのデータにアクセスする手段を提供する. 具体的に,下記のデータが input.json に保存されているとする.

// input.json
{
   "n": 10,
   "a": ["item0", "item1"],
   "d": {"X": 1.5, "Y": 2.5}
}

このファイル input.json を X10 から読み込むには次のように書く. なお,plham.main.BaseMain を継承した場合,コマンドライン引数 args に指定される JSON ファイルは BaseMain 内で読み込み処理され,フィールド変数 CONFIG に保存される.

val json = JSON.parse(new File("input.json"));

X10 上から,JSON ファイルの内容を取得する例を以下に示す. なお,X10JSON では整数,実数などの区別はなくすべて文字列型で格納されるため,toLong()toDouble() などで型変換する必要がある. また,文字列を取得する場合にも toString() を呼び出す.

val n = json("n").toLong();               // "n" を Long 型として取得する
val a0 = json("a")(0).toString();         // 配列 "a" の第 0 要素 "item0" を取得する
val dkey1 = json("d")("X").toDouble();    // 辞書 "d" の鍵 "X" に対する値 1.5 を取得する

val a = json("a");
val a1 = a(1).toString();                 // 配列 "a" の第 1 要素 "item1" を取得する

val d = json("d");
val dkey2 = d("Y").toDouble();            // 辞書 "d" の鍵 "Y" に対する値 2.5 を取得する

継承(extends)

X10JSON plham.util.JSON はオブジェクト属性の継承をサポートしている. 継承はオブジェクトの任意の箇所で "extends" キーワードを使用することで認識され,その値として基本オブジェクト(継承元)を指定する: "extends": base-object-name. 基本オブジェクト(継承元)と派生オブジェクト(継承先)で同じ名前の属性が再定義されている場合,"extends” の前で宣言されたか後で宣言されたかにかかわらず,すべて派生オブジェクトの値でオーバーライドされる. 継承の効果は,"extends" の出現箇所に影響されないので,オブジェクト定義の冒頭に書くことを推奨する. たとえば,以下の JSON ファイルの場合,

{
    "base-object": {
        "a": 1,
        "b": 2,
        "c": 3
    },
    "derived-object": {
        "a": 11,
        "extends": "base-object",
        "b": 12,
        "d": 14
    }
}

"derived-object" は次の定義と等価である.

    "derived-object": {
        "a": 11,
        "b": 12,
        "c": 3,
        "d": 14
    }

X10JSON で継承を作用させるには以下のように書く.

JSON.extend(json)