如何定义JSON Schema限制数值必须为10的幂?
实现JSON Schema验证10的幂数值
你之前用multipleOf: 10的写法只对大于等于10的10次幂有效,比如10、100这类,因为multipleOf的逻辑是「数值必须是指定值的整数倍」,像1是10的0.1倍,0.1是10的0.01倍,都不是整数倍,自然通不过验证。
想要准确验证所有10的幂(包括1、0.1、1e-5这类),有两种可行方案:
方案一:利用自定义验证关键字(推荐,需验证器支持)
标准JSON Schema没有内置判断10的幂的关键字,但大多数主流验证器(比如AJV)支持自定义关键字。你可以添加一个自定义规则,通过数学计算判断数值是否为10的幂:
自定义关键字示例(以AJV为例)
首先定义验证函数:
const ajv = new Ajv(); ajv.addKeyword({ keyword: 'powerOfTen', type: 'number', validate: (schema, data) => { if (data <= 0) return false; // 10的幂都是正数 const logValue = Math.log10(data); return Number.isInteger(logValue); // 以10为底的对数是整数,说明是10的幂 }, errors: false });
然后在JSON Schema中使用这个关键字:
"scaleFactor": { "type": "number", "powerOfTen": true }
这个方法能准确覆盖所有10的幂,包括极大或极小的数值(比如1e100、1e-100)。
方案二:标准JSON Schema近似实现(无自定义依赖)
如果必须用纯标准JSON Schema,只能通过枚举常见的10的幂,结合anyOf来覆盖场景。虽然没法穷尽所有可能,但能满足大多数业务需求:
"scaleFactor": { "type": "number", "anyOf": [ { "const": 1e5 }, { "const": 1e4 }, { "const": 1e3 }, { "const": 100 }, { "const": 10 }, { "const": 1 }, { "const": 0.1 }, { "const": 0.01 }, { "const": 1e-3 }, { "const": 1e-4 }, { "const": 1e-5 } // 可根据业务需求继续添加更多10的幂 ] }
这种方法的缺点是无法覆盖所有可能的10的幂,只能预先定义需要用到的数值。
内容的提问来源于stack exchange,提问作者Paul Grinberg
相关产品推荐
相关产品推荐

