模式的 json 文件验证不起作用

问题描述 投票:0回答:1

我正在尝试使用模式验证 json 文件,但即使我从加载的文件中删除一些字段,它也总是说它是有效的,请参阅:

import jsonschema
from jsonschema import validate

my_schema = {
    'ID': {'type': 'string'},
    'Country': {'type': 'string'},
    'Name': {'type': 'string'},
    'A': {'type': 'string'},
    'B': {'type': 'string'},
    'C': {'type': 'string'},
    'D': {'type': 'string'}
}


def validate_json(json_data):
    try:
        validate(instance=json_data, schema=my_schema)
    except jsonschema.exceptions.ValidationError as err:
        return 'Given JSON data is Invalid'
    return 'Given JSON data is Valid'


# Function to validate the json file
def validate_json_syntax(json_file):
    try:
        with open(json_file, 'r') as f:
            data = json.load(f)
        return validate_json(data)
    except FileNotFoundError as e:
        print('Read file: Unsuccessful - %s!' % e)
        return None


# Validate json file syntax
print(validate_json_syntax(file_name))

该文件存储了以下数据:

[[{"ID": "101", "Country": "UK", "Name": "none", "A": "2", "B": "6", "C": "0", "D": "0"}, 
  {"ID": "102", "Country": "UK", "Name": "bla", "A": "1", "B": "2", "C": "0", "D": "0"}], 
  [{"ID": "110", "Country": "GB", "Name": "nana", "A": "2", "B": "6", "C": "0", "D": "0"}, 
   {"ID": "111", "Country": "GB", "Name": "bla", "A": "1", "B": "3", "C": "0", "D": "0"}]
]

但是即使我更改文件,例如:

[[{"ID": "101", "Country": "UK", "B": "6", "C": "0", "D": "0"}, 
  {"ID": "102", "Country": "UK", "Name": "bla", "A": "1", "B": "2", "C": "0", "D": "0"}], 
  [{"ID": "110", "Country": "GB", "Name": "nana", "A": "2", "B": "6", "C": "0", "D": "0"}, 
   {"ID": "111", "Country": "GB", "Name": "bla", "A": "1", "B": "3", "C": "0", "D": "0"}]
]

使用架构的 json 验证函数的结果仍然有效。

更新我的架构:

my_schema = {
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "array",
  "items": [
    {
      "type": "array",
      "items": [
        {
          "type": "object",
          "properties": {
            "ID": {
              "type": "string"
            },
            "Country": {
              "type": "string"
            },
            "Name": {
              "type": "string"
            },
            "A": {
              "type": "string"
            },
            "B": {
              "type": "string"
            },
            "C": {
              "type": "string"
            },
            "D": {
              "type": "string"
            }
          },
          "required": [
            "ID",
            "Country",
            "Name",
            "A",
            "B",
            "C",
            "D"
          ]
        }
      ]
    }
  ]
}

但它似乎仍然没有验证所有的json文件。 正如我们在示例中看到的,给定的模式可以重复出现多次。使用新模式,即使我删除最后一条记录上的某些字段,它仍然表示它是有效的。

[[{"ID": "101", "Country": "UK", "Name": "none", "A": "2", "B": "6", "C": "0", "D": "0"}, 
  {"ID": "102", "Country": "UK", "Name": "bla", "A": "1", "B": "2", "C": "0", "D": "0"}], 
  [{"ID": "110", "Country": "GB", "Name": "nana", "A": "2", "B": "6", "C": "0", "D": "0"}, 
   {"ID": "111", "Country": "GB", "B": "3", "C": "0", "D": "0"}]
]

看来我确实错过了一些东西。

我需要如何更改架构?

python json jsonschema
1个回答
0
投票

尝试这个模式。

my_schema = {
    "type": "array",
    "items": {
        "type": "array",
        "items": {
            "type": "object",
            "properties": {
                'ID': {'type': 'string'},
                'Country': {'type': 'string'},
                'Name': {'type': 'string'},
                'A': {'type': 'string'},
                'B': {'type': 'string'},
                'C': {'type': 'string'},
                'D': {'type': 'string'}
                },
            "required": [
                "ID",
                "Country",
                "Name",
                "A",
                "B",
                "C",
                "D"
                ]
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.