web-dev-qa-db-ja.com

多くのプロパティのうち少なくとも1つを必要とするJSONスキーマを定義する方法

オブジェクトに可能な多くのプロパティの少なくとも1つを必要とするJSONスキーマ(ドラフト4)を定義できるかどうかを知りたいです。私はすでにallOfanyOf、およびoneOfを知っていますが、私が望む方法でそれらを使用する方法がわかりません。

以下に、JSONの例を示します。

// Test Data 1 - Should pass
{

    "email": "[email protected]",
    "name": "John Doe"
}
// Test Data 2 - Should pass
{
    "id": 1,
    "name": "Jane Doe"
}
// Test Data 3 - Should pass
{
    "id": 1,
    "email": "[email protected]",
    "name": "John Smith"
}
// Test Data 4 - Should fail, invalid email
{
    "id": 1,
    "email": "thisIsNotAnEmail",
    "name": "John Smith"
}

// Test Data 5 - Should fail, missing one of required properties
{
    "name": "John Doe"
}

少なくともidまたはemail(両方とも受け入れます)を要求し、フォーマットに応じた検証に合格したいです。 oneOfを使用すると、両方を指定すると検証に失敗し(テスト3)、anyOfのいずれかが無効であっても検証に合格します(テスト4)

これが私のスキーマです:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "id": "https://example.com",
    "properties": {
        "name": {
            "type": "string"
        }
    },
    "anyOf": [
        {
            "properties": {
                "email": {
                    "type": "string",
                    "format": "email"
                }
            }
        },
        {
            "properties": {
                "id": {
                    "type": "integer"
                }
            }
        }
    ]
}

ユースケースの正しい検証を達成する方法を教えていただけますか?

33
MaxiWheat

一連のプロパティの少なくとも1つを要求するには、一連のrequiredオプション内でanyOfを使用します。

{
    "type": "object",
    "anyOf": [
        {"required": ["id"]},
        {"required": ["email"]}
        // any other properties, in a similar way
    ],
    "properties": {
        // Your actual property definitions here
    }
{

必要なプロパティが存在する場合("id""email")、対応するオプションをallOfに渡します。

59
cloudfeet

minProperties: number(および必要に応じてmaxProperties: number)を使用できます。これにより、スキーマ定義が短縮されます。

{
     type: "object",
     minProperties: 1,
     properties: [/* your actual properties definitions */],
}

ドキュメントへのリンク: https://json-schema.org/understanding-json-schema/reference/object.html#size

6
NBR