我正在尝试使用模式验证 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"}]
]
看来我确实错过了一些东西。
我需要如何更改架构?
尝试这个模式。
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"
]
}
}
}