0

以下は私のjsonスキーマです

actionType要素の値IDが「SAVECONTACT」の場合にのみ、言及されたすべてのオプションのタグがtrueになる依存関係があります

そのような依存関係を実装する方法がわかりません

これで私を助けてください

{
    "type": "object",
    "properties": {
        "userId": {
            "type": "string",
            "optional": true
        },
        "groupId": {
            "type": "string",
            "optional": true
        },
        "socialMediaContacts": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "smContactId": {
                        "type":"string"
                    },
                    "actionType": {
                        "type":"string",
                        "enum" : ["SAVECONTACT", "DELETECONTACT", "SAVEGROUP", "DELETEGROUP"]
                    },
                    "contactLastName": {
                        "type":"string",
                        "optional": true
                    },
                    "contactFirstName": {
                        "type":"string",
                        "optional": true
                    },
                    "nickName": {
                        "type":"string",
                        "optional": true
                    },
                    "contactType": {
                        "type":"string",
                        "enum" : ["SM", "REG"],
                        "optional": true
                    },
                    "mediaSource": {
                        "type":"string",
                        "enum" : ["FB", "FS", "TW"],
                        "optional": true
                    },
                    "socialMediaHandle": {
                        "type":"string",
                        "optional": true
                    },
                    "email": {
                        "type":"string",
                        "optional": true
                    },
                    "phone": {
                        "type":"string",
                        "optional": true
                    }
                }
            }
        }
    }
}
4

2 に答える 2

0

あなたの問題の解決策は、この質問で提案したのと同じアプローチを使用することだと思います。

まず、カスタムタグ「optional」の代わりに「required」を使用する標準的な方法を使用します。Draft 4 バリデーターを使用している場合、次のようなものが機能する可能性があります。

{
"type": "object",
"properties": {
    "userId": {
        "type": "string",
        "optional": true
    },
    "groupId": {
        "type": "string",
        "optional": true
    },
    "socialMediaContacts": {
        "type": "array",
        "allOf":
        {
            "properties": {
                    "smContactId": {"type":"string"},
                    "actionType": {"enum" : ["SAVECONTACT", "DELETECONTACT", "SAVEGROUP", "DELETEGROUP"]},
                    "contactLastName": {"type":"string"},
                    "contactFirstName": {"type":"string"},
                    "nickName": {"type":"string"},
                    "contactType": {"type":"string","enum" : ["SM", "REG"]},
                    "mediaSource": {"type":"string","enum" : ["FB", "FS", "TW"]},
                    "socialMediaHandle": {"type":"string"},
                    "email": {"type":"string"},
                    "phone": {"type":"string"}
                },
                "required": ["actionType","smContactId"],
                "additionalProperties": False
            },
        "oneOf": [
            { "$ref": "#/definitions/savecontact" },
            { "$ref": "#/definitions/otheroperations" }
        ]
    }
},
"definitions": {
    "savecontact": {
        "properties": {
            "actionType": { "enum": [ "SAVECONTACT" ] },

        },
        "required": ["contactLastName","contactFirstName", etc. etc.],
    },
    "otheroperations": {
        properties": {
            "actionType": {"enum" : ["DELETECONTACT", "SAVEGROUP", "DELETEGROUP"]}
        }
    }
}

}

問題の完全なコンテキストはわかりませんが、操作ごとに 1 つのスキーマを使用する方が理にかなっている可能性があります。

于 2013-08-22T17:39:29.903 に答える