You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSON文件Schema验证异常:删除字段仍显示有效,如何修正Schema?

JSON Schema验证失效问题:缺失必填字段仍提示有效,怎么改?

问题重现

使用jsonschema库验证JSON文件时,即使删除JSON对象中的Name、A等字段,验证函数仍返回Given JSON data is Valid。以下是相关代码和JSON示例:

原验证代码

import jsonschema
from jsonschema import validate
import json  # 原代码遗漏json模块导入

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'


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


file_name = "your_json_file.json"  # 替换为实际文件名
print(validate_json_syntax(file_name))

原始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", "Name": "bla", "A": "1", "B": "3", "C": "0", "D": "0"}]
]

修改后的JSON数据(缺失字段)

[[{"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"}]
]

问题原因

  1. Schema结构不规范:原Schema没有遵循jsonschema的标准格式——既没指定type: "object",也没用properties包裹字段定义,更没有required数组标记必填字段。默认情况下,jsonschema只会校验存在的字段类型,不会检查字段是否必须存在。
  2. 未匹配二维数组结构:你的JSON是嵌套的二维数组,但原Schema直接验证整个数组,没有对应嵌套结构的校验规则,导致验证逻辑完全不匹配实际数据结构。

修改方案

重新定义Schema,同时满足两个核心要求:匹配JSON的二维数组结构,明确标记所有必填字段。

修改后的完整代码

import jsonschema
from jsonschema import validate
import json

# 单个对象的Schema:定义字段类型和必填项
item_schema = {
    "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"]
}

# 外层二维数组的Schema
my_schema = {
    "type": "array",
    "items": {
        "type": "array",
        "items": item_schema  # 内层数组的每个元素必须符合item_schema规则
    }
}


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


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


file_name = "your_json_file.json"
print(validate_json_syntax(file_name))

关键修改点说明

  • item_schema:
    • type: "object" 明确这是对象类型的Schema
    • properties 统一包裹所有字段的类型定义
    • required 数组标记所有必须存在的字段,只要缺失其中一个,验证就会抛出错误
  • my_schema:
    • 外层定义为array,items指定外层数组的每个元素也是array
    • 内层数组的items指向item_schema,确保内层数组的每个对象都符合字段要求

验证效果

使用修改后的代码验证缺失字段的JSON时,会返回类似如下的错误提示:

Given JSON data is Invalid: 'Name' is a required property

内容的提问来源于stack exchange,提问作者FotisK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:53:10