首页 > 解决方案 > 基于 JSON 模式解析输入

问题描述

我们正在为一个与另一个团队编写的后端通信的 Web 应用程序构建一个前端项目。一些开发人员同时从事这两个项目,并且对后端和响应字段的变化有更好的理解。

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

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

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

也许验证器不是正确的工具,但这就是我在搜索 JSON 模式解析器时发现的全部。有人可以引导我朝着正确的方向前进,以免我重新发明轮子吗?听起来这个功能与验证器已经完成的功能非常相似,我宁愿在同一通道中进行此处理。

标签: javascriptjsonschema

解决方案


找到了一个可以满足我要求的验证器: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' }

推荐阅读