使用ajv来保证数组中特定索引的值类型

时间:2018-06-07 19:37:14

标签: jsonschema ajv

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

注意:我在不使用JSONSchema验证的情况下以另一种方式工作。我很好奇是否可以使用JSONSchema验证来实现相同的目标。

规则是:

  1. 它可以包含任意数量的项目,我们只关心索引0和1。
  2. 第一项索引0必须是字符串。
  3. 第二项索引1必须是对象。
  4. 如果索引0或1处的项目(无论数组的长度如何)对任一索引都有效,请在适当的索引处插入另一项的默认值。
  5. 如果数组没有项目,请在适当的索引处插入两个默认值。
  6. 这是一个代码片段,希望能够解释我正在努力实现的目标。谢谢。

    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 ]
    

1 个答案:

答案 0 :(得分:1)

JSON Schema仅进行验证。它不会修改正在验证的值。由于您的示例需要在特殊情况下插入值,因此JSON Schema无法执行此操作。

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