这个 JSON 类型定义有什么问题?

问题描述 投票:0回答:1

我有一些代码来创建和验证应表示标记联合的 JSON 模式。我希望

direction
道具值为
lt
gt
et
,并且根据该值,对象将包含某些其他道具,例如
amount
range
:

import Ajv from "ajv/dist/jtd"
const ajv = new Ajv()

const Filter = {
    "discriminator": "direction",
    "mapping": {
        "gt": {
            "properties": {
                "amount": { "type": "number" }
            }
        },
        "lt": {
            "properties": {
                "amount": { "type": "number" }
            }
        },
        "et": {
            "properties": {
                "range": {
                    "properties": {
                        "top": { "type": "number" },
                        "bottom": { "type": "number" }
                    }
                }
            }
        }
    }
};

const validateFilter = ajv.compile(Filter);

结果:

Error: schema is invalid: 
data/discriminator must NOT have additional properties, 
data must have property 'ref', 
data must have property 'type', 
data must have property 'enum', 
data must have property 'elements', 
data must have property 'properties', 
data must have property 'optionalProperties', 
data/mapping/gt/properties/amount/type must NOT have additional properties, 
data/mapping/gt/properties/amount must have property 'ref', 
data/mapping/gt/properties/amount/type must be equal to one of the allowed values, 
data/mapping/gt/properties/amount must have property 'enum', 
data/mapping/gt/properties/amount must have property 'elements', 
data/mapping/gt/properties/amount must have property 'properties', 
data/mapping/gt/properties/amount must have property 'optionalProperties', 
data/mapping/gt/properties/amount must have property 'discriminator', 
data/mapping/gt/properties/amount must have property 'values', 
data/mapping/gt/properties/amount must match a schema in union, 
data/mapping/gt must have property 'optionalProperties', 
data/mapping/gt must match a schema in union, 
data must have property 'values', 
data must match a schema in union

我不知道为什么会发生这种情况。这是一个要搞乱的沙箱: https://codesandbox.io/s/ajv-errors-54rdmx

json types schema ajv
1个回答
0
投票

请注意,ajv 为鉴别器关键字提供有限支持。但是,如果我正确理解了您尝试验证的标记联合,那么这里是验证过滤器的示例:

// To use discriminator keyword you have to set discriminator: true with Ajv constructor: it is not enabled by default.
const ajv = new Ajv({ discriminator: true });

const Filter = {
    type: 'object',
    discriminator: { propertyName: 'direction' },
    required: ['direction'],
    oneOf: [
        {
            required: ['amount'],
            properties: {
                direction: { enum: ['gt', 'lt'] },
                amount: { type: 'number' }
            }
        },
        {
            required: ['range'],
            properties: {
                direction: { const: 'et' },
                range: {
                    type: 'object',
                    properties: {
                        top: { type: 'number' },
                        bottom: { type: 'number' }
                    }
                }
            }
        },
    ]
};

const validateFilter = ajv.compile(Filter);
© www.soinside.com 2019 - 2024. All rights reserved.