0

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

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

规则是:

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

这是一个代码片段,希望能解释我想要完成的事情。谢谢。

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 ]
4

1 回答 1

1

JSON Schema 仅进行验证。它不会修改正在验证的值。由于您的示例需要在特殊情况下插入值,因此 JSON Schema 不能这样做。

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

于 2018-06-08T20:04:45.647 回答