基于 JSON 模式解析输入
Parsing input based on JSON schema
我们正在为 Web 应用构建一个前端项目,该项目与另一个团队编写的后端进行通信。一些开发人员在这两个项目上工作,并且对返回的后端和响应字段的更改有更好的理解。
最近我们有部分前端中断,因为他们根据对后端的更改对应用程序的某些部分进行了更改,而没有更新所有地方的逻辑。为了缓解这种情况,我想提出一个 mask/template 的概念,所有响应数据都将通过该概念进行整理。这样,团队中不熟悉后端的其他成员就可以 notice/address 这些错误。
为此,我正在考虑使用 JSON 架构。然而,我不想简单地验证,而是想通过它解析后端数据(删除模式中不存在的字段)。这样,开发人员在前端进行更改以响应后端更改也需要更新此模板,因此会触发测试失败,直到所有使用此模式的逻辑都更新(不仅仅是他接触的逻辑)。我正在玩https://www.npmjs.com/package/jsonschema,但它似乎没有办法删除多余的字段,只是测试它们。
在 JSON 架构中,我还可以设置 additionalProperties
标志。但是,它有两个问题:
- 它不会导致验证器删除字段,它只是将它们转储到错误数组
- 每层嵌套都需要单独设置,所以我需要遍历整个JSON结构,这时候我基本上就自己写了parser/validator.
也许验证器不是执行此操作的正确工具,但这就是我在搜索 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' }
我们正在为 Web 应用构建一个前端项目,该项目与另一个团队编写的后端进行通信。一些开发人员在这两个项目上工作,并且对返回的后端和响应字段的更改有更好的理解。
最近我们有部分前端中断,因为他们根据对后端的更改对应用程序的某些部分进行了更改,而没有更新所有地方的逻辑。为了缓解这种情况,我想提出一个 mask/template 的概念,所有响应数据都将通过该概念进行整理。这样,团队中不熟悉后端的其他成员就可以 notice/address 这些错误。
为此,我正在考虑使用 JSON 架构。然而,我不想简单地验证,而是想通过它解析后端数据(删除模式中不存在的字段)。这样,开发人员在前端进行更改以响应后端更改也需要更新此模板,因此会触发测试失败,直到所有使用此模式的逻辑都更新(不仅仅是他接触的逻辑)。我正在玩https://www.npmjs.com/package/jsonschema,但它似乎没有办法删除多余的字段,只是测试它们。
在 JSON 架构中,我还可以设置 additionalProperties
标志。但是,它有两个问题:
- 它不会导致验证器删除字段,它只是将它们转储到错误数组
- 每层嵌套都需要单独设置,所以我需要遍历整个JSON结构,这时候我基本上就自己写了parser/validator.
也许验证器不是执行此操作的正确工具,但这就是我在搜索 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' }