如何验证JSON数据的结构、类型及键顺序?匹配指定结构并输出差异
如何验证JSON数据的结构、类型及键顺序?
我来分享一个实用的Python实现方案,刚好能解决你这个需求——验证给定JSON数据里的Product字段是否完全匹配指定的结构(包括键的顺序、值的类型,以及键的完整性),如果不一致还能明确输出问题点。
先明确需求要点
我们需要验证:
- 输入数组中的每个元素必须包含
Product字段 Product的键顺序必须和指定结构完全一致Product中每个键对应的值的类型要和指定结构匹配- 若存在缺失或不一致,输出具体的问题内容
具体实现代码
首先定义待验证的数据和目标基准结构,然后编写验证函数:
# 待验证的输入数据(可以替换成你实际的数据集) input_data = [ {'DeviceInstanceId': 1, 'IsResetNeeded': False, 'ProductType': 'testing', 'Product': {'Family': '12345', "Model": "f10", "Type": "data", "Vendor": "qspi"}}, # 测试用的错误数据,用来验证检测逻辑 {'DeviceInstanceId': 2, 'IsResetNeeded': True, 'ProductType': 'production', 'Product': {'Model': "f20", "Family": "67890", "Type": 123, "Vendor": "spi"}} ] # 指定的目标Product结构(作为验证的基准) target_product_structure = {'Family': '12345', "Model": "f10", "Type": "data", "Vendor": "qspi"} def validate_product_structure(input_items, target_struct): # 提取目标结构的键顺序和对应值的类型 target_keys = list(target_struct.keys()) target_value_types = {key: type(value) for key, value in target_struct.items()} for index, item in enumerate(input_items): print(f"\n=== 验证第 {index+1} 条数据 ===") # 检查是否存在Product字段 if 'Product' not in item: print(f"❌ 缺失必填字段: 'Product'") continue current_product = item['Product'] current_keys = list(current_product.keys()) # 检查键的完整性(数量+是否有缺失/多余) if len(current_keys) != len(target_keys): print(f"❌ Product字段键数量不符") missing_keys = [k for k in target_keys if k not in current_keys] extra_keys = [k for k in current_keys if k not in target_keys] if missing_keys: print(f" 缺失的键: {missing_keys}") if extra_keys: print(f" 多余的键: {extra_keys}") # 检查键的顺序是否一致 if current_keys != target_keys: print(f"❌ Product字段键顺序不符") print(f" 预期顺序: {target_keys}") print(f" 实际顺序: {current_keys}") # 检查值的类型是否匹配 type_errors = [] for key in target_keys: if key not in current_product: continue # 前面已检查键完整性,这里做兜底 current_type = type(current_product[key]) expected_type = target_value_types[key] if current_type != expected_type: type_errors.append(f"{key}: 预期类型 {expected_type.__name__}, 实际类型 {current_type.__name__}") if type_errors: print(f"❌ Product字段值类型不匹配:") for error in type_errors: print(f" {error}") # 验证通过的情况 if current_keys == target_keys and not type_errors: print(f"✅ Product结构验证完全通过") # 执行验证 validate_product_structure(input_data, target_product_structure)
代码说明
- 键顺序验证:利用Python 3.7+字典保留插入顺序的特性,直接对比键的列表即可判断顺序是否一致
- 类型验证:提前提取目标结构中每个键对应值的类型,再逐一比对实际数据的类型
- 错误提示:针对不同的问题(缺失字段、键数量不符、顺序错误、类型不匹配)给出明确的提示信息,方便定位问题
额外说明
如果你的原始数据是JSON字符串格式,只需要先用json.loads()转换成Python字典再传入函数即可,例如:
import json json_str = '[{"DeviceInstanceId": 1, "IsResetNeeded": false, ...}]' input_data = json.loads(json_str)
内容的提问来源于stack exchange,提问作者nrs
相关产品推荐
相关产品推荐

