javascript - 基于 JSON 模式解析输入
问题描述
我们正在为一个与另一个团队编写的后端通信的 Web 应用程序构建一个前端项目。一些开发人员同时从事这两个项目,并且对后端和响应字段的变化有更好的理解。
最近我们遇到了部分前端中断,因为他们根据后端的更改对应用程序的某些部分进行了更改,而没有更新所有地方的逻辑。为了缓解这种情况,我想提出一个掩码/模板的概念,所有响应数据都将通过该模板/模板进行管理。这样,团队中不熟悉后端的其他成员可以注意到/解决这些错误。
为此,我正在考虑使用 JSON Schema。但是,我不想简单地验证,而是想通过它解析后端数据(删除模式中不存在的字段)。这样,开发人员在前端进行更改以响应后端更改也需要更新此模板,因此会触发测试失败,直到更新使用此模式的所有逻辑(不仅仅是他接触的逻辑)。我正在玩https://www.npmjs.com/package/jsonschema,但它似乎没有办法删除多余的字段,只需测试它们。
在 JSON Schema 中,我还可以设置additionalProperties
标志。但是,它有两个问题:
- 它不会导致验证器删除字段,它只是将它们转储到错误数组
- 它需要在每个嵌套级别单独设置,因此我需要遍历整个 JSON 结构,此时我基本上最终会编写自己的解析器/验证器。
也许验证器不是正确的工具,但这就是我在搜索 JSON 模式解析器时发现的全部。有人可以引导我朝着正确的方向前进,以免我重新发明轮子吗?听起来这个功能与验证器已经完成的功能非常相似,我宁愿在同一通道中进行此处理。
解决方案
找到了一个可以满足我要求的验证器:https ://github.com/acornejo/jjv 。它有removalAdditional
我可以设置的标志,这是我做的一个快速测试:
var jjv = require('jjv')();
var addressSchema = {
"id": "address",
"type": "object",
"properties": {
"lines": {
"type": "array",
"items": {"type": "string"}
},
"zip": {"type": "string"},
"city": {"type": "string"},
"country": {"type": "string"}
},
"required": ["country"]
};
var schema = {
"id": "person",
"type": "object",
"properties": {
"name": {"type": "string"},
"address": {"$ref": "address"},
"votes": {"type": "integer", "minimum": 1}
}
};
var p = {
"name": "Barack Obama",
"address": {
"lines": [ "1600 Pennsylvania Avenue Northwest" ],
"zip": "DC 20500",
"city": "Washington",
"foobar": "baz",
"country": "USA"
},
"a": {
"b": 1,
"c": 2
},
"votes": "lots",
"stuff": "yes"
};
jjv.addSchema('address', addressSchema);
jjv.addSchema('schema', schema);
jjv.defaultOptions.checkRequired = true;
jjv.defaultOptions.removeAdditional = true;
console.log(jjv.validate('schema', p));
console.log(p);
和回应:
{ validation: { votes: { type: 'integer' } } }
{ name: 'Barack Obama',
address:
{ lines: [ '1600 Pennsylvania Avenue Northwest' ],
zip: 'DC 20500',
city: 'Washington',
country: 'USA' },
votes: 'lots' }
推荐阅读
- python - 批量预测 Vertext AI
- asp.net-mvc - JQuery ajax 调用块 RedirectToAction
- git - fedora 上安装的 git 包在哪里?
- java - for循环中的Java removeIf条件
- spring-boot - mybatis gloal param 无效
- javascript - 如何在页面加载时加载“对象”标签的内容?
- php - 根据另一个输入进行 livewire 验证
- javascript - Extjs 应用程序在动态添加一个有缺陷的项目时崩溃
- angular - 将来自 valuechanges 和 statuschanges 反应形式的 observables 与 rxjs 以角度结合
- tensorflow - 如何使用 tflite_model_maker 在 Tensorboard 上显示检测结果