【问题标题】:Using ajv to guarantee the value types, at specific indices, in an array使用 ajv 保证数组中特定索引处的值类型
【发布时间】:2018-06-07 19:37:13
【问题描述】:

我正在尝试使用 ajv 来保证数组遵守关于什么是有效值的严格规则。我不确定要使用哪些修改或其他关键字来实现我正在寻找的结果。可以使用一些见解。

注意:我有另一种工作方式,没有使用 JSONSchema 验证。我只是好奇是否可以使用 JSONSchema 验证来实现相同的目标。

规则是:

  1. 它可以包含任意数量的项目,我们只关心索引 0 和 1。
  2. 第一项,索引 0,必须是字符串。
  3. 第二个项目,索引 1,必须是一个对象。
  4. 如果索引 0 或 1 处的项目(无论数组的长度如何)对任一索引都有效,则在相应索引处插入另一个项目的默认值。
  5. 如果数组没有项,则在适当的索引处插入两个默认值。

这是一个代码 sn-p,希望能解释我想要完成的工作。谢谢。

const schema = {
    "type": "array",
    "items": [
        {
            "type": "string",
            "default": ""
        },
        {
            "type": "object",
            "default": {}
        }
    ]
};

function fn( array ) {

    ajv.validate( schema, array );
    console.log( array );

}

fn([]);
fn([ '1' ]);
fn([ { bar: 2} ]);
fn([ 'word', { foo: 3 } ]);
fn([ 'word', 42 ]);
fn([ [ 1, 2, 3 ],  { baz: 4 } ]);
fn([ 'word', { a: 1, b: 2 }, 42 ]);

// Actual results:

// [ '', {} ] => Expected
// [ '1', {} ] => Expected
// [ { bar: 2 }, {} ] => Not what I want
// [ 'word', { foo: 3 } ] => Expected
// [ 'word', 42 ] => Not what I want
// [ [ 1, 2, 3 ], { baz: 4 } ] => Not what I want
// [ 'word', { a: 1, b: 2 }, 42 ] => Expected, indices 0 and 1 are all I care about

// Desired results:

// [ '', {} ]
// [ '1', {} ]
// [ '1', { bar: 2 } ]
// [ 'word', { foo: 3 } ]
// [ 'word', {} ]
// [ '', { baz: 4 } ]
// [ 'word', { a: 1, b: 2 }, 42 ]

【问题讨论】:

    标签: jsonschema ajv


    【解决方案1】:

    JSON Schema 只做验证。它不会修改正在验证的值。由于您的示例需要在特殊情况下插入值,因此 JSON Schema 无法做到。

    但是,您可能会问,default 呢? default 实际上是一个元数据关键字,如 titledescription。它不会以任何方式影响验证。许多库作者为此提供了某种支持,但无论他们做什么,这都不是标准行为。

    【讨论】:

    • 谢谢。这澄清了事情。我对很多事情都使用基本的 JSONSchema 验证,但我总是对验证部分感到困惑。上面的模式示例是否或不应该通过使用“type”关键字暗示该类型的值是预期的?例如,我仍然希望,在我给出的 7 个示例调用中,其中 3 个将无法通过验证,因为索引 0 不是字符串和/或索引 1 不是对象。
    • AJV 和其他模式验证器,文档似乎暗示不仅其他类型会通过验证,而且这是正常的,并且在某种程度上是合乎逻辑的。其实对我来说不是。如果其他类型可以通过您的验证,那么针对一个类型进行验证有什么意义?我可能只需要喝杯咖啡并尝试阅读整个 JSONSchema 规范,以期获得一些启发。哈哈。无论如何,感谢您的回复。 :)
    • 我认为这是一个比 cmets 更大的对话。是的,这是有道理的,是的,这是一种不同的范式,它要求你以不同于你可能习惯的方式思考问题。如果您将 "minItems": 2 添加到您的架构中,您应该会看到更多预期的行为。
    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    相关资源
    最近更新 更多