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

jsonschema - 校验Json内容和格式

1、创建对象

from pydantic import BaseModel
from typing import List

class Person(BaseModel):
    name: str
    age: int

class Student(Person): 
    level: int = 16
    friends: 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 validate

try:
    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 validate
    raise 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.kler.cn/a/321085.html

相关文章:

  • 用pandoc工具实现ipynb,md,word,pdf之间的转化
  • Android Settings 单元测试 | 如何运行单元测试?
  • 浅谈React的虚拟DOM
  • 从0开始学习--Day26--聚类算法
  • 【C++】string(一)
  • 【Linux】Linux 权限的理解
  • Python知识点:如何使用Python进行区块链开发
  • dockercompose指定配置文件
  • 分布式中间件-Pika一个高效的分布式缓存组件
  • MySQL数据库(基础)
  • Linux中部署Docker环境;Docker常用操作
  • 三.python入门语法1
  • redis安装(以6.0.13为例)
  • 金融领域的人工智能——Palmyra-Fin 如何重新定义市场分析
  • 【解密 Kotlin 扩展函数】自定义函数(十二)
  • Java 编码系列:线程基础与最佳实践
  • TS系列(3):常用类型(详细)
  • 把握旅游新契机,开启旅游创业新征程
  • 【Springboot入门-自动配置】
  • 【Qualcomm】高通SNPE框架的使用 | 原始模型转换为量化的DLC文件 | 在Android的DSP端运行模型
  • filebeat采集挂载出来的/home/Logs下的日志过程
  • 数据库 - MySQL的事务
  • TikTok直播推流不精准该怎么办?跟IP有关系吗?
  • 【北京迅为】《STM32MP157开发板使用手册》-第四十三章 软件定时器实验
  • 基于SpringBoot的图书进销存管理系统【附源码】
  • 利用Spring Boot开发学生宿舍管理系统