コンテンツにスキップ

データ指向プログラミング

参考資料

JSON Schema

簡易版

  • データ指向プログラミング, P.186, リスト7-24
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
  "type": "array", // ← ルートレベルでは、データは配列
  "items": {
    "type": "object", // ← 配列の各要素はマップ
    "properties": { // ← マップ内の各フィールドのプロパティ
      "myNumber": {"type": "number"}, // ← myNumber は数値
      "myString": {"type": "string"}, // ← myString は文字列
      // ↓ myEnum は"myVal"と"yourVal"の 2 つの選択肢を持つ列挙値
      "myEnum": {"enum": ["myVal", "yourVal"]},
      "myBool": {"type": "boolean"} // ← myBool はブール値
    },
    // ↓ マップの必須フィールドは myNumber と myString。他のフィールドはオプション
    "required": ["myNumber", "myString"],
    // ↓ スキーマで明示的に指定されていないフィールドは許可しない
    "additionalProperties": false
  }
}

高度版

  • データ指向プログラミング, P.315, リスト12-30
  • 有効なデータの例, リスト12‒31

スキーマ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
{
  "type": "array", // ← ルートレベルでは、データは配列
  "items": {
    "type": "object", // ← 配列の各要素はマップ
    "properties": { // ← マップ内の各フィールドのプロパティ
      "myNumber": { "type": "number" }, // ← myNumber は数値
      "myString": { "type": "string" }, // ← myString は文字列
      // ↓ myEnum は"myVal"と"yourVal"の 2 つの選択肢を持つ列挙値
      "myEnum": { "enum": ["myVal", "yourVal"] },
      "myBool": { "type": "boolean" } // ← myBool はブール値
      "myAge": { // ← myAge は 0~120 の整数
        "type": "integer",
        "minimum": 0,
        "maximum": 120
      },
      "myBirthday": { // ← myBirthday は日付フォーマットに準拠する文字列
        "type": "string",
        "format": "date"
      },
      "myLetters": { // ← myLetters は文字(小文字または大文字)だけで構成された文字列
        "type": "string",
        "pattern": "[a-zA-Z]*"
      }
      "myNumberMap": { // ← myNumberMap はすべての値が数値である同種文字列マップ
        "type": "object",
        "additionalProperties": { "type": "number" }
      },
      "myTuple": { // ← myTuple は 1 つ目の要素が文字列、2 つ目の要素が数値のタプル
        "type": "array",
        "prefixItems": [
          { "type": "string" },
          { "type": "number" }
        ]
      } },
    // ↓ マップの必須フィールドは myNumber と myString。他のフィールドはオプション
    "required": ["myNumber", "myString"],
    // ↓ スキーマで明示的に指定されていないフィールドは許可しない
    "additionalProperties": false
  }
}

データ例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[
  {
    "myNumber": 42,
    "myString": "I-love-you",
    "myEnum": "myVal",
    "myBool": true,
    "myTuple": ["Hello", 42]
  },
  {
    "myNumber": 54,
    "myString": "Happy",
    "myAge": 42,
    "myBirthday": "1978-11-23",
    "myLetters": "Hello",
    "myNumberMap": {
      "banana": 23,
      "apple": 34 }
  },
]

JSON Schemaからデータモデルフォーマットの図を生成するツール

JSON Schemaでのマルチメソッド

  • C#dynamicキーワードでマルチメソッドをネイティブサポート.
  • マルチメソッドが対応しているのは静的なデータ型だけで, 汎用的なデータ構造には対応していない.

スキーマに準拠するランダムデータの生成