【问题标题】:Ruby JSON Schema Validator Not Returning Expected ResultRuby JSON Schema Validator 未返回预期结果
【发布时间】:2017-10-11 16:10:43
【问题描述】:

我正在使用 JSON 模式验证器 gem 来验证返回的响应是否带有预期的键和值类型。我的数据应该以以下 JSON 格式返回:

{
    "hierarchies": [
        {
            "hierarchyId": "123ABC456DEF789",
            "depth": 1,
            "hierarchyNodes": [
                {
                    "nodeId": "ANID123456FORNODE789",
                    "id": "12345678"
                }
            ]
        }
    ]
}
  • “层次结构”可以是 0..N 个元素的数组
  • “hierarchyNodes”也可以是 0..N 个元素的数组

我当前的架构如下(我目前缺少节点数组):

schema = {
  '$schema' => 'http://json-schema.org/draft-04/schema#',
  type: 'object',
  properties: {
    hierarchies: {
      type: 'array',
      properties: {
        object_items: {
          type: 'object',
          properties: {
            hierarchyId: { type: 'string' },
            depth: { type: 'integer' }
          },
          required: [:hierarchyId, :depth],
          additionalProperties: false
        }
      },
      required: [:object_items]
    }
  },
  required: [:hierarchies]
}

由于某种原因,当所有这些的预期结果应该为假时,以下返回真:

0> JSON::Validator.validate(schema, {hierarchies: [{}] }) => 是的

0> JSON::Validator.validate(schema, {hierarchies: [{hierarchyId: 'hi', depth: 1, something: 'hey'}] }) => 是的

0> JSON::Validator.validate(schema, {x: [{a: 'something'}] }) => 是的

预期的 True 结果将具有以下架构,并且只有此架构:

JSON::Validator.validate(schema, {hierarchies: [{hierarchyId: 'id', 深度:1}] })

谁能让我知道我在设置验证架构时出了什么问题?

谢谢!

【问题讨论】:

  • 尝试使用类似JSON Schema Validator 的工具进行测试。即使添加了缺少的,,它也发现您的示例存在错误。
  • @tadman,我看到逗号在哪里丢失了,我已经添加了它。这是一个复制错误。我会去那个网站看看能不能找到答案。
  • 我仍然得到一个无效的结果
  • 您是否尝试过使用像this one 这样的生成器来生成基线参考?
  • @tadman,我会尝试创建一个准确的基础。我注意到生成器可以创建“必需”属性,我认为这是我问题的一半。我会再试一次。谢谢!

标签: json ruby validation jsonschema


【解决方案1】:

使用@tadman 提供的建议,我找到了这个解决方案:

schema = {
  '$schema': 'http://json-schema.org/draft-06/schema#',
  'properties': {
    'hierarchies': {
      'additionalItems': false,
      'items': {
        'additionalItems': false,
        'properties': {
          'depth': { 'type': 'integer' },
          'hierarchyId': { 'type': 'string' },
          'hierarchyNodes': {
            'additionalItems': false,
            'items': {
              'additionalItems': false,
              'properties': {
                'id': { 'type': 'string' },
                'nodeId': { 'type': 'string' }
              },
              'required': ['nodeId', 'id'],
              'type': 'object'
            },
            'type': 'array'
          }
        },
        'required': ['hierarchyId', 'depth', 'hierarchyNodes'],
        'type': 'object'
      },
      'type': 'array'
    }
  },
  'required': ['hierarchies'],
  'type': 'object'
}

【讨论】:

  • additionalItems 在此架构中无效。 additionaltems 仅适用于 items 是数组时。否则,它看起来不错!
  • @Jason,感谢您的评论。虽然没有必要,但将additionalItems 留在其中应该不会有什么坏处,对吗?如果正在验证的 json 响应中存在更多属性,有没有办法让这个模式失败?
  • 离开它不会改变验证行为,这并没有什么坏处。但是,我无法想象为什么你会想要在你的架构中有一些被错误地使用并且什么都不做的东西。
  • 您可以将"additionalProperties": false 添加到您的对象架构中,当 JSON 具有额外属性时,验证将失败。但是,我始终建议最好直接忽略这些属性而不是禁止它们。
  • 如果 JSON 具有架构中特别需要的属性以外的任何额外属性,我希望验证失败。我们想知道是否随着时间的推移添加了任何内容,因为这是来自外部区域使用的服务,他们期望得到非常具体的响应。
猜你喜欢
  • 2011-08-09
  • 2010-09-22
  • 2021-05-17
  • 2018-02-19
  • 2018-03-23
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多