代码之家  ›  专栏  ›  技术社区  ›  Alexander Tsepkov

基于JSON模式的输入解析

  •  1
  • Alexander Tsepkov  · 技术社区  · 7 年前

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

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

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

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

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

    也许验证器不是正确的工具,但在搜索JSON模式解析器时,我只找到了这一点。有人能引导我朝正确的方向走,这样我就不会重新发明轮子了吗?听起来这个功能与验证器已经做的非常相似,我宁愿在同一个过程中做这个处理。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Alexander Tsepkov    7 年前

    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' }