web-dev-qa-db-ja.com

JSONスキーマ-すべてのプロパティが必要

JSONスキーマのrequiredフィールド

JSONスキーマは、propertiesrequiredadditionalPropertiesフィールドを備えています。例えば、

{
    "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のリストにコピーアンドペーストすることがよくあります。タイプミスやその他のばかげたエラーが原因でリストが一致しない場合は、厄介なバグに悩まされます。

明示的に名前を付けずに、すべてのプロパティが必要であることを示す短い方法はありますか?

33
Adam Matan

すべてのフィールドに明示的に名前を付ける代わりに、単に「minProperties」プロパティを使用できます。

{
    "type": "object",
    "properties": {
        "elephant": {"type": "string"},
        "giraffe": {"type": "string"},
        "polarBear": {"type": "string"}
    },
    "additionalProperties": false,
    "minProperties": 3
}
30
San Jay

必要な配列で明示的に名前を付ける以外に、必要なプロパティを指定する方法はないと思います。

しかし、この問題が頻繁に発生する場合は、jsonスキーマを後処理して、定義されたすべてのオブジェクトに必要な配列を自動的に追加する小さなスクリプトを書くことをお勧めします。

スクリプトはjson-schemaツリーをトラバースするだけでよく、各レベルで「properties」キーワードが見つかった場合、同じレベルのプロパティに含まれるすべての定義済みキーを含む「required」キーワードを追加します。

機械に退屈な仕事をさせましょう。

8
jruizaranguren

たとえば、DBでrequiredinsertを使用したいが、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
    }
}
0
Dallas