web-dev-qa-db-ja.com

プロパティの1つに基づくJSONスキーマanyOf検証

いずれかのプロパティの値に基づいてオブジェクトの配列を検証する方法を理解するのに苦労しています。したがって、次のようなJSONオブジェクトがあります。

{
    "items": [
        {
            "name": "foo",
            "otherProperty": "bar"
        },
        {
            "name": "foo2",
            "otherProperty2": "baz",
            "otherProperty3": "baz2"
        },
        {
            "name": "imInvalid"
        }
    ]
}

私はそれを言いたいです

  1. アイテムには、名前が「foo」または「foo2」のanyOfオブジェクトを含めることができます。
  2. 「foo」の場合、有効な他のプロパティ(必須)は「otherProperty」のみです。
  3. 名前が「foo2」の場合、有効な他のプロパティは「otherProperty2」と「otherProperty3」の両方が必要です。
  4. 「名前」には「foo」と「foo2」以外の値は有効ではありません
  5. オブジェクト自体はitems配列ではオプションであり、一部は繰り返される場合があります。

いろいろ試してみましたが、検証しても失敗しないようです。たとえば、「imInvalid」という名前は検証エラーを引き起こしているはずです。これは、スキーマの最新の反復です。何が足りないのですか?

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "required": ["items"],
    "properties": {
        "items": {
            "type": "array",
            "minItems": 1,
            "additionalProperties": false,
            "properties": {
                "name": {
                    "anyOf": [
                        {
                            "type": "object",
                            "required": ["name", "otherProperty"],
                            "additionalProperties": false,
                            "properties": {
                                "otherProperty": { "type": "string" },
                                "name": { "enum": [ "foo" ] }
                            }
                        },{
                            "type": "object",
                            "required": ["name", "otherProperty2", "otherProperty3" ],
                            "additionalProperties": false,
                            "properties": {
                                "otherProperty2": { "type": "string" },
                                "otherProperty3": { "type": "string" },
                                "name": { "enum": [ "foo2" ] }
                            }
                        }
                    ]
                }
            }
        }
    }
}
10
Fo.

あなたはマッチング何分離するために、列挙型を使用しての基本的な考え方を持っているが、ここではミスのカップルがあります:

  • Jsonスキーマ配列にはプロパティがなく、アイテムがあります。
  • そのプロパティ内で、他のjsonスキーマオブジェクトを保持する属性として名前を定義しています。
  • スキーマの2番目のブランチでは、otherProperty3を定義しましたが、サンプルでは、​​そのプロパティはanotherProperty3と呼ばれています。

このわずかに変更されたバージョンを試してください:

{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": ["items"],
"properties": {
    "items": {
        "type": "array",
        "minItems": 1,
        "additionalProperties": false,
        "items": {
            "anyOf": [
                {
                    "type": "object",
                    "required": ["name", "otherProperty"],
                    "additionalProperties": false,
                    "properties": {
                        "otherProperty": { "type": "string" },
                        "name": { "enum": [ "foo" ] }
                    }
                },{
                    "type": "object",
                    "required": ["name", "otherProperty2", "anotherProperty3" ],
                    "additionalProperties": false,
                    "properties": {
                        "otherProperty2": { "type": "string" },
                        "anotherProperty3": { "type": "string" },
                        "name": { "enum": [ "foo2" ] }
                    }
                }
            ]
        }
    }
}
}
10
user1270191