根据JSON模式解析输入

时间:2018-08-01 16:59:44

标签: javascript jsonschema

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

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

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

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

  • 这不会导致验证程序删除字段,只是将它们转储到错误数组中
  • 它需要在每个嵌套级别分别设置,因此我需要遍历整个JSON结构,这时我基本上结束了编写自己的解析器/验证器。

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

1 个答案:

答案 0 :(得分:0)

找到了一个符合我要求的验证器: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' }