JSON スキーマの型の再利用

JSON スキーマは、特定のアプリケーションで必要な JSON データの形式とそのやりとりの方法を提供する標準です。多くの既存のデータ形式または型は、この標準を使用して表されます。具体的な例を挙げると、RAML ファイルで記述される REST API の型は JSON スキーマで定義されることが多いです。

定義済みの型を再利用するには、JSON スキーマを DataWeave に読み込み、各自のスクリプトで型構造を使用できるようにします。

JSON スキーマローダーは、 JSON スキーマの Draft 7ˆ​ を使用してスキーマを解析します。

JSON スキーマの型のインポート

次の例は、リソースディレクトリの JSON スキーマ (​Person.json​) を示しています。

JSON スキーマ (​example/schema/Person.json​):
{
  "$id": "https://example.com/person.schema.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Person",
  "type": "object",
  "properties": {
    "firstName": {
      "type": "string",
      "description": "The person's first name."
    },
    "lastName": {
      "type": "string",
      "description": "The person's last name."
    },
    "age": {
      "description": "Age in years, which must be equal to or greater than zero.",
      "type": "integer",
      "minimum": 0
    }
  },
  "required": ["firstName", "lastName"]
}

次の例は、JSON スキーマローダーを使用して型をインポートする方法を示しています。

DataWeave スクリプトヘッダー:
import * from jsonschema!example::schema::Person

インポート構文

JSON スキーマの型をインポートするには、以下の構文を使用します。

  • typeToImport​: *​ を単独で使用してスキーマで定義されているすべての型をインポートしたり、スキーマの 1 つの型 (​Root​ など) をインポートしたりできます。異なる名前の JSON スキーマの型 (​Root as Person​ など) をインポートすることもできます。これにより、スクリプトでその名前を使用して型を参照できます。

  • pathToJsonSchema​: スキーマファイルへのパスを指定するには、ファイルの区切り文字を ​::​ に置き換えて、ファイル名の ​.json​ 拡張子を削除します。たとえば、スキーマへのパスが ​example/schema/Person.json​ の場合、​example::schema::Person​ を使用します。

import _typesToImport_ from jsonschema!_pathToJsonSchema_

次の例は、型をインポートする方法を示しています。

import * from jsonschema!example::schema::Person

DataWeave スクリプトでの型の使用

上記の例のインポートディレクティブをスクリプトヘッダーに含めると、JSON スキーマの既存のすべての型が読み込まれます。​import * from jsonschema!example::schema::Person​ の既存の型は、ルートで指定されている ​Root​ 型のみです。この型では、3 つのプロパティ (​firstName​、​lastName​、​age​) を含めることができるオブジェクトが記述されています。これは、DataWeave スクリプトで次の型を宣言することに相当します。

DataWeave スクリプト:
%dw 2.0
type Root = { firstName: String, lastName: String, age?: Number }

age​ は、唯一の省略可能な項目 (​?​ で示される) になります。

型を使用して、値が JSON スキーマで定義された構造に従っているかどうかを判断できます。 次の例では、オブジェクトに必須項目 ​firstName​ および ​lastName​ が含まれているため、値 ​true​ が出力されます。

DataWeave スクリプト:
%dw 2.0
import * from jsonschema!jsonschema!example::schema::Person
---
{
 firstName: "John",
 lastName: "Doe"
} is Root
出力:
"true"

次の例では、オブジェクトに必須項目 ​firstName​ および ​lastName​ が含まれていないため、値 ​false​ が出力されます。

DataWeave スクリプト:
%dw 2.0
import * from jsonschema!jsonschema!example::schema::Person
---
{
 firstName: "John",
 age: 20
} is Root
出力:
"false"

スキーマ内の定義の使用

DataWeave は、モジュールのインポート時に JSON スキーマ内の定義を読み込みます。

JSON スキーマ (​example/schema/Account.json​):
{
 "$schema": "http://json-schema.org/draft-04/schema#",
 "definitions": {
   "address": {
     "type": "object",
     "properties": {
       "street_address": {
         "type": "string"
       },
       "city": {
         "type": "string"
       },
       "state": {
         "type": "string"
       }
     },
     "required": [
       "street_address",
       "city",
       "state"
     ]
   },
   "person": {
     "type": "object",
     "properties": {
       "firstName": {
         "type": "string",
         "description": "The person's first name."
       },
       "lastName": {
         "type": "string",
         "description": "The person's last name."
       },
       "age": {
         "description": "Age in years, which must be equal to or greater than zero.",
         "type": "integer",
         "minimum": 0
       }
     },
     "required": [
       "firstName",
       "lastName"
     ]
   }
 },
 "type": "object",
 "properties": {
   "person": {
     "$ref": "#/definitions/person"
   },
   "address": {
     "$ref": "#/definitions/address"
   }
 }
}

次のディレクティブを使用して、そのスキーマの型をインポートできます。

import * from jsonschema!example::schema::Account

スキーマで定義された型には、次の型の宣言と同じ効果があります。

type Root = { address?: address, person?: person }

type address = { street_address: String, city: String, state: String }

type person = { firstName: String, lastName: String, age?: Number }

インポートディレクティブを使用して、スキーマの 1 つの型をインポートします。

import address from jsonschema!example::schema::Account

型名の競合を回避するために、​as​ キーワードを使用して、インポートされた型名を別の名前に変更できます。

import address as Account_Address from jsonschema!example::schema::Account

パターン一致での使用の促進

JSON スキーマからインポートされた型を使用して、特定の型の入力である場合に特定のアクションを実行できます。これらのインポートされた型は、パターン一致で役立ちます。

次の例では、値 ​person​ が出力されます (オブジェクトでその型定義がインポートされるため)。

DataWeave スクリプト:
%dw 2.0
import * from jsonschema!example::schema::Account
---
{
 firstName: "John",
 lastName: "Doe"
} match {
case is person -> "PERSON"
case is address -> "ADDRESS"
else -> "NO TYPE MATCHED"
}
出力:
"PERSON"

次の例では、値 ​address​ が出力されます (オブジェクトでその型定義がインポートされるため)。

DataWeave スクリプト:
%dw 2.0
import * from jsonschema!example::schema::Account
---
{
 street_address: "742 Evergreen Terrace",
 city: "Gotham",
 State: "OH"
} match {
case is person -> "PERSON"
case is address -> "ADDRESS"
else -> "NO TYPE MATCHED"
}
出力:
"ADDRESS"