Json Ajv:如何利用自定义关键字的$data引用?

Json Ajv:如何利用自定义关键字的$data引用?,json,jsonschema,json-schema-validator,ajv,Json,Jsonschema,Json Schema Validator,Ajv,我正在我的项目中使用。我正试图通过ajv.addKeywordapi的帮助添加自定义关键字。我可以通过这样做添加关键字(从文档中借用): 但是看起来,$dataref还不支持自定义字段。如文档中所述,$data ref仅支持以下字段 关键字中支持$data引用:常量、枚举、格式、, 最大/最小,排他最大/排他最小,最大长度/ minLength、maxItems/minItems、maxProperties/minProperties、, formatMaximum/formatMinimum,

我正在我的项目中使用。我正试图通过
ajv.addKeyword
api的帮助添加自定义关键字。我可以通过这样做添加关键字(从文档中借用):

但是看起来,
$data
ref还不支持自定义字段。如文档中所述,$data ref仅支持以下字段

关键字中支持$data引用:常量、枚举、格式、, 最大/最小,排他最大/排他最小,最大长度/ minLength、maxItems/minItems、maxProperties/minProperties、, formatMaximum/formatMinimum,formatExclusiveMaximum/ FormatExclusiveMinum、multipleOf、pattern、required、uniqueItems

获取值的一种方法是,我使用validate函数
data、dataPath、parentData、parentDataProperty
的参数和write logic来提取由
$data
ref定义的字段的值。但我不确定这是否是一种正确的实现方法。有人能帮我吗?这是我的建议。谢谢。

挖了一段时间后,我终于成功了。为读者分享解决方案总是好的。这就是我所做的:

// Code goes here
console.clear();
var ajv = new Ajv({
  $data: true
});


ajv.addKeyword('range', {
  type: 'number',
  errors: true,
  $data: true, // important part
  validate: function(schema, data, parentSchema) {
    const {
      exclusiveRange: isExclusive
    } = parentSchema;
    const [min, max] = schema;
    if (isExclusive) {
      return data > min && data < max;
    }
    return data >= min && data <= max;
  }
});

var schema = {
  "properties": {
    "smaller": {
      "type": "number",
      "maximum": {
        "$data": "1/larger"
      }
    },
    "larger": {
      "type": "number",
      // "range": [2, 10],
      "range": {
        "$data": "1/myRange"
      },
      "exclusiveRange": true
    },
    "myRange": {
      type: "array",
      items: {
        type: "number"
      }
    }
  }
};


var validData = {
  smaller: 3,
  larger: 7,
  myRange: [2, 10]
};

let validateData = ajv.compile(schema);
validateData(validData);
console.log(ajv);
console.log('Errors after validations --> ', validateData.errors)
//代码在这里
console.clear();
var ajv=新ajv({
$data:true
});
ajv.addKeyword('范围'{
键入:“编号”,
错误:正确,
$data:true,//重要部分
验证:函数(架构、数据、父架构){
常数{
排他性
}=父模式;
const[min,max]=模式;
如果(isExclusive){
返回数据>最小值&数据<最大值;
}

return data>=min&&data这听起来像是一个功能请求。文档中说你不能做你要求做的事情。我建议你在项目github repo上提交一个问题。我想我已经接近解决方案了。我得到了数据表达式。我只需要对它进行评估。这是我在Ajv中寻找的函数plunker,它是的。如果你有任何想法,请建议。而且一旦我完成了,我会提出一个功能请求。如果可能的话,也提交一个PR。
var schema = {
  "properties": {
    "smaller": {
      "type": "number"
    },
    "larger": {
      "type": "number",
      // "range": [2, 10],
      "range": {
        "$data": "1/myRange" // referencing to myRange
      }
    },
    "myRange": {
      type: "array",
      items: {
        type: "number"
      }
    }
  }
};
// Code goes here
console.clear();
var ajv = new Ajv({
  $data: true
});


ajv.addKeyword('range', {
  type: 'number',
  errors: true,
  $data: true, // important part
  validate: function(schema, data, parentSchema) {
    const {
      exclusiveRange: isExclusive
    } = parentSchema;
    const [min, max] = schema;
    if (isExclusive) {
      return data > min && data < max;
    }
    return data >= min && data <= max;
  }
});

var schema = {
  "properties": {
    "smaller": {
      "type": "number",
      "maximum": {
        "$data": "1/larger"
      }
    },
    "larger": {
      "type": "number",
      // "range": [2, 10],
      "range": {
        "$data": "1/myRange"
      },
      "exclusiveRange": true
    },
    "myRange": {
      type: "array",
      items: {
        type: "number"
      }
    }
  }
};


var validData = {
  smaller: 3,
  larger: 7,
  myRange: [2, 10]
};

let validateData = ajv.compile(schema);
validateData(validData);
console.log(ajv);
console.log('Errors after validations --> ', validateData.errors)