基于 JSON 模式解析输入

Parsing input based on JSON schema

我们正在为 Web 应用构建一个前端项目,该项目与另一个团队编写的后端进行通信。一些开发人员在这两个项目上工作,并且对返回的后端和响应字段的更改有更好的理解。

最近我们有部分前端中断,因为他们根据对后端的更改对应用程序的某些部分进行了更改,而没有更新所有地方的逻辑。为了缓解这种情况,我想提出一个 mask/template 的概念,所有响应数据都将通过该概念进行整理。这样,团队中不熟悉后端的其他成员就可以 notice/address 这些错误。

为此,我正在考虑使用 JSON 架构。然而,我不想简单地验证,而是想通过它解析后端数据(删除模式中不存在的字段)。这样,开发人员在前端进行更改以响应后端更改也需要更新此模板,因此会触发测试失败,直到所有使用此模式的逻辑都更新(不仅仅是他接触的逻辑)。我正在玩https://www.npmjs.com/package/jsonschema,但它似乎没有办法删除多余的字段,只是测试它们。

在 JSON 架构中,我还可以设置 additionalProperties 标志。但是,它有两个问题:

也许验证器不是执行此操作的正确工具,但这就是我在搜索 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' }