当前位置: 首页 > news >正文

jsonschema - 校验Json内容和格式

1、创建对象

from pydantic import BaseModel
from typing import Listclass Person(BaseModel):name: strage: intclass Student(Person): level: int = 16friends: List[Person]  

2、生成 schema

schema = Student.model_json_schema()

内容如下

{'$defs': {'Person': {'properties': {'name': {'title': 'Name', 'type': 'string'}, 'age': {'title': 'Age', 'type': 'integer'}}, 'required': ['name', 'age'], 'title': 'Person', 'type': 'object'}}, 'properties': {'name': {'title': 'Name', 'type': 'string'}, 'age': {'title': 'Age', 'type': 'integer'}, 'level': {'title': 'Level', 'type': 'integer'}, 'friends': {'items': {'$ref': '#/$defs/Person'}, 'title': 'Friends', 'type': 'array'}}, 'required': ['name', 'age', 'level', 'friends'], 'title': 'Student', 'type': 'object'} 

3、生成测试数据

对象转 json 字符串


fre0 = Person(age=15, name='alice') 
fre1 = Person(age=17, name='Allen') stu = Student(age=15, name='Betty', level = 3, friends = [fre0, fre1]) d1 = stu.__dict__
print(d1) # {'name': 'Betty', 'age': 15, 'level': 3, 'friends': {name='alice', age=15}, Person(name='Allen', age=17)]}import json 
json.dumps(d1, default=lambda obj:obj.__dict__, sort_keys=True, indent=4 )  # Object of type Person is not JSON serializable
json_str = '''
{"age": 15, "friends": [{"age": 15, "name": "alice"}, {"age": 17, "name": "Allen"}], "level": 3, "name": "Betty"}
'''

4、校验 validate

d2 = json.loads(json_str)schema = {'$defs': {'Person': {'properties': {'name': {'title': 'Name', 'type': 'string'}, 'age': {'title': 'Age', 'type': 'integer'}}, 'required': ['name', 'age'], 'title': 'Person', 'type': 'object'}}, 'properties': {'name': {'title': 'Name', 'type': 'string'}, 'age': {'title': 'Age', 'type': 'integer'}, 'level': {'title': 'Level', 'type': 'integer'}, 'friends': {'items': {'$ref': '#/$defs/Person'}, 'title': 'Friends', 'type': 'array'}}, 'required': ['name', 'age', 'level', 'friends'], 'title': 'Student', 'type': 'object'}from jsonschema import validatetry:ret = validate(instance=d2, schema=schema)print(ret) # 返回 None 代表没问题 if ret == None:print('-- json 格式符合')else:print('xx json 格式不符合') 
except Exception as err:print('xx json 验证失败 ')

5、错误情况

以上json 没问题,如果把 json 数据 或字典 故意处理为错误的数据类型,或格式,如下:

{"age": 15, "friends": [{"age": 15, "name": "alice"}, {"age": 17, "name": "Allen"}], "level": 3, "name": 12} 

validate 会报出 Error

Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/Users/xxx/python3.11/site-packages/jsonschema/validators.py", line 1332, in validateraise error
jsonschema.exceptions.ValidationError: 12 is not of type 'string'Failed validating 'type' in schema['properties']['name']:{'title': 'Name', 'type': 'string'}On instance['name']:12

2024-09-20(六)

http://www.lryc.cn/news/442594.html

相关文章:

  • 浅谈计算机视觉新手的学习路径
  • SQL编程题复习(24/9/19)
  • 提前解锁 Vue 3.5 的新特性
  • web基础—dvwa靶场(十)XSS
  • 搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(五)-聚合
  • Pandas中df常用方法介绍
  • LabVIEW中AVI帧转图像数据
  • 并发与并行的区别:深入理解Go语言中的核心概念
  • 小小扑克牌算法
  • 【第34章】Spring Cloud之SkyWalking分布式日志
  • easy-es动态索引支持
  • SWC(Speedy Web Compiler)
  • 【计算机网络】传输层协议UDP
  • Docker+PyCharm远程调试环境隔离解决方案
  • 数字化转型的理论框架对比:从多维视角指导企业成功变革对比DPBOKIT4ITCOBITTOGAF
  • 【C++掌中宝】深入解析C++命名空间:有效管理代码的利器
  • 2024/9/21 leetcode 21.合并两个有序链表 2.两数相加
  • Python学习的主要知识框架
  • LLaMA-Factory 使用 alpaca 格式的数据集
  • 【Mysql】Mysql数据库基础
  • 一文彻底让你搞懂轨迹规划(总结)
  • windows C++ 并行编程-异步消息块(二)
  • 【软件基础知识】什么是 API,详细解读
  • 计算机四级-计算机网络
  • 【linux 获取时间】
  • Dockerfile部署xxljob
  • Conda新建python虚拟环境问题
  • 这几个优秀的工具网站真心值得推荐——搜嗖工具箱
  • ESP32开发 -- VSCODE+PlatformIO环境安装
  • MySQL--导入SQL文件(命令行导入)