required
フィールドJSONスキーマは、properties
、required
、additionalProperties
フィールドを備えています。例えば、
{
"type": "object",
"properties": {
"elephant": {"type": "string"},
"giraffe": {"type": "string"},
"polarBear": {"type": "string"}
},
"required": [
"elephant",
"giraffe",
"polarBear"
],
"additionalProperties": false
}
次のようなJSONオブジェクトを検証します。
{
"elephant": "Johnny",
"giraffe": "Jimmy",
"polarBear": "George"
}
ただし、プロパティのリストがexactlyでない場合は失敗しますelephant, giraffe, polarBear
。
properties
のリストをrequired
のリストにコピーアンドペーストすることがよくあります。タイプミスやその他のばかげたエラーが原因でリストが一致しない場合は、厄介なバグに悩まされます。
明示的に名前を付けずに、すべてのプロパティが必要であることを示す短い方法はありますか?
すべてのフィールドに明示的に名前を付ける代わりに、単に「minProperties」プロパティを使用できます。
{
"type": "object",
"properties": {
"elephant": {"type": "string"},
"giraffe": {"type": "string"},
"polarBear": {"type": "string"}
},
"additionalProperties": false,
"minProperties": 3
}
必要な配列で明示的に名前を付ける以外に、必要なプロパティを指定する方法はないと思います。
しかし、この問題が頻繁に発生する場合は、jsonスキーマを後処理して、定義されたすべてのオブジェクトに必要な配列を自動的に追加する小さなスクリプトを書くことをお勧めします。
スクリプトはjson-schemaツリーをトラバースするだけでよく、各レベルで「properties」キーワードが見つかった場合、同じレベルのプロパティに含まれるすべての定義済みキーを含む「required」キーワードを追加します。
機械に退屈な仕事をさせましょう。
たとえば、DBでrequired
にinsert
を使用したいが、update
を実行するときにスキーマに対してのみ検証したい場合は、ワンライナーを使用してコードでこれを行います。
prepareSchema(action) {
const actionSchema = R.clone(schema)
switch (action) {
case 'insert':
actionSchema.$id = `/${schema.$id}-Insert`
actionSchema.required = Object.keys(schema.properties)
return actionSchema
default:
return schema
}
}