web-dev-qa-db-ja.com

JSONスキーマ-別のフィールドの値に基づいてフィールドを指定する必要があります

スキーマドラフト03でこれが可能かどうか疑問に思います。他の場所で作業している依存関係がありますが、いくつかのフィールドのrequiredプロパティを指定するためにそれらを使用するために必要な創造的な使用がおそらくあると思います。

私の現在の最善の試み(うまくいかない)は、私が何を望んでいるかについてのあなたの考えを与えるはずです。デフォルトで必須の値が必要で、別のフィールドに特定の値がある場合はオプションです。

{
    "description"   : "An address...",
    "type" : "object",
    "properties" : {
        "postcode": {
            "type" : "string",
            // postcode should be required by default
            "required" : true,      
            // postcode shouldn't be required if the country is new zealand 
            "dependencies" : {
                "country" : {
                    "enum" : ["NZ", "NZL", "NEW ZEALAND"]
                },
                "postcode" : {
                    "required" : false      
                }
            }
        },
        "country": {
            "type" : "string",
            "enum" : [
                // various country codes and names...
            ],
            "default" : "AUS"
        }
    }
}
35
pospi

これは、ドラフトのバージョン3で間違いなく可能です。許可された国の完全なリストがあるので、次のようなことができます。

{
    "type": [
        {
            "title": "New Zealand (no postcode)",
            "type": "object",
            "properties": {
                "country": {"enum": ["NZ", "NZL", "NEW ZEALAND"]}
            }
        },
        {
            "title": "Other countries (require postcode)",
            "type": "object",
            "properties": {
                "country": {"enum": [<all the other countries>]},
                "postcode": {"required": true}
            }
        }
    ],
    "properties": {
        "country": {
            "type" : "string",
            "default" : "AUS"
        },
        "postcode": {
            "type" : "string"
        }
    }
}

そのため、実際にはスキーマに2つのサブタイプを定義します。1つは郵便番号が必要な国用、もう1つは必要ない国用です。

[〜#〜] edit [〜#〜]-v4と同等のものは非常に似ています。単にトップレベルの名前を変更"type"配列から"oneOf"

27
cloudfeet

誰かがドラフト4のソリューションを探している場合は、dependenciesキーワードとenumキーワードを一緒に使用できます。

{
    "type": "object",
    "properties": {
        "play": {
            "type": "boolean"
        },
        "play-options": {
            "type": "string"
        }
    },
    "dependencies": {
        "play-options": {
            "properties": {
                "play": {
                     "enum": [true]
                }
            }
        }
    }
}

この方法ではplay-optionsは常にplayの値がtrueである必要があります。

12
ppalacios

私は03バージョンの仕様を見たばかりで、あなたが説明していることが可能だとは思いません。これは間違いなく「単純な依存関係」ではなく、「スキーマ依存関係」の説明には、プロパティのvalueを考慮する方法は記載されていません。

必要なのは「条件付きスキーマ依存性」だと思われます。

ここでは、単純な依存関係とスキーマ依存関係で何が可能かについての議論があります: http://groups.google.com/group/json-schema/msg/8145690ebb93963b

条件付き依存関係をサポートする計画があるかどうか、そのグループに尋ねることができます。

2
Chris Sears