【问题标题】:jsonschema strip out unknown fieldsjsonschema 去掉未知字段
【发布时间】:2019-08-06 01:00:14
【问题描述】:

有没有什么方法可以使用 jsonschema 基于模式验证 json 并从 json 中去除未知键?

架构示例:

{
  "type":"object",
  "$schema": "http://json-schema.org/draft-03/schema",
  "required":False,
  "properties":{
    "address": {
      "type":"object",
      "required":True,
      "properties":{
        "city": {
          "type":"string",
          "required":True
        }
    },
    "phoneNumber": {
      "type":"array",
      "required":False,
      "items":
      {
        "type":"object",
        "required":False,
        "properties":{
          "number": {
            "type":"string",
            "required":False
          }
        }
      }
    }
  }
}

示例数据:

{
  "address":{
    "streetAddress": "1 Street",
    "city":"New York",
    "name": "Tom",
    "houseNumber":18
  },
  "phoneNumber":[
    {
      "type":"home",
      "number":"212 222 2222"
    }
  ]
}

所以验证器应该传递数据并返回剥离后的版本,如下所示:

{
  "address":{
    "city":"New York",
  },
  "phoneNumber":[
    {
      "number":"212 222 2222"
    }
  ]
}

Cerberus 确实具有“purge_unknown”功能,但它不支持 JSON-Schema。

【问题讨论】:

  • 过滤不是 JSON Schema 的功能。另见stackoverflow.com/questions/57000651/…
  • @gregsdennis 我想知道我是否使用验证错误列表并过滤掉未知键
  • 您可以通过遍历示例 JSON 并检查模式数据中的键匹配来强制您想要保留的值。如果没有匹配项,则只需在示例中删除该项目。

标签: python json python-3.x jsonschema


【解决方案1】:

我注意到您可以根据验证错误过滤掉未知字段。在这种情况下,您可以使用additionalProperties 字段来限制意外键。

{
  "type":"object",
  "$schema": "http://json-schema.org/draft-03/schema",
  "required":false,
  "properties":{
    "address": {
      "type":"object",
      "required":true,
      "properties":{
        "city": {
          "type":"string",
          "required":true
        }
      },
      "additionalProperties": false,
    },
    "phoneNumber": {
      "type":"array",
      "required":false,
      "items":
      {
        "type":"object",
        "required":false,
        "properties":{
          "number": {
            "type":"string",
            "required":false
          }
        },
        "additionalProperties": false,
      }
    }
  }
}

这是给定示例输入的验证结果:

消息: 尚未定义属性“streetAddress”,并且架构不允许其他属性。
架构路径: #/properties/address/additionalProperties

消息: 尚未定义属性“名称”,并且架构不允许附加属性。 架构路径: #/properties/address/additionalProperties

消息: 尚未定义属性“houseNumber”,并且架构不允许其他属性。 架构路径: #/properties/address/additionalProperties

消息: 尚未定义属性“类型”,并且架构不允许附加属性。 架构路径: #/properties/phoneNumber/items/additionalProperties

【讨论】:

  • 从我的实验看来,似乎没有办法从顶部执行此操作 - 对此进行递归设置而不是必须将其添加到每个有子项的属性中会非常好。跨度>
猜你喜欢
  • 1970-01-01
  • 2021-02-01
  • 2012-01-24
  • 1970-01-01
  • 2012-01-29
  • 2019-02-05
  • 2019-08-19
  • 2012-11-29
  • 1970-01-01
相关资源
最近更新 更多