0

次のJSON検証があります

var schema = {
    "type": "object",
    "required": ["name", "profession"],
    "properties": {
        "name": { "type": "string" },
        "profession": {
            "oneOf": [
                { "$ref": "#/definitions/developer" },
                { "$ref": "#/definitions/manager" }
            ]
        }
    },
    "definitions": {
        "developer": {
            "type": "object",
            "properties": {
                "jobLevel": { "$ref": "#/definitions/jobLevels" },
                "linesOfCode": { "type": "number" },
                "languages": { "enum": ["C++", "C", "Java", "VB"] }
            },
            "required": ["jobLevel"]
        },
        "manager": {
            "type": "object",
            "properties": {
                "jobLevel": { "$ref": "#/definitions/jobLevels" },
                "peopleManaged": { "type": "number" },
                "responsibilities": {
                    "type": "array",
                    "minItems": 1,
                    "items": "string",
                    "uniqueItems": true
                }
            },
            "required": ["jobLevel"]
        },
        "jobLevels": { "enum": ["Beginner", "Senior", "Expert"] }
    }
}

上記の検証文字列を使用して、次の JSON 文字列を検証しようとしました。

 var validate = ajv.compile(schema);
 var valid = validate({
     "name": "David",
     "profession": {
         "jobLevel": "Expert",
         "linesOfCode": 50000,
         "languages": "Java"
     },
 });

ここで、「data.profession は oneOf 内の 1 つのスキーマと正確に一致する必要があります」というメッセージが表示されますが、データ内に正しいインスタンス変数などを含むインスタンスを 1 つだけ提供します。ここで私が間違っていることを教えてください。ちなみに、私はAJVバリデーターを使用しています。

ありがとうございました。

4

1 に答える 1

1

ここでの問題は、職業オブジェクトのオブジェクトが oneOf キーワード内の両方のスキーマに従って有効であり、仕様では厳密に 1 つのスキーマに対して有効である必要があることです: https://github.com/epoberezkin/ajv/blob/master/KEYWORDS .md#oneof

両方のスキーマに従って有効である理由は、追加のプロパティが許可されているためです。

あなたはできる:

  • anyOf を使用します (最初のスキーマが成功すると検証が停止するため、50% のケースで高速になります)
  • use additionalProperties: false を使用して、追加フィールドを許可しない
于 2016-10-20T21:02:46.567 に答える