jsonschema删除未知字段

时间:2019-08-06 01:00:14

标签: python json python-3.x jsonschema

有什么方法可以使用schemaschema验证基于模式的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。

1 个答案:

答案 0 :(得分:0)

我注意到您可以根据验证错误过滤掉未知字段。在这种情况下,您可以使用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