【问题标题】:Parsing input based on JSON schema基于 JSON 模式解析输入
【发布时间】:2018-08-01 16:59:43
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: javascript jsonschema


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      相关资源
      最近更新 更多