网站用户界面ui设计细节,wordpress自动留言,一般上什么网站,中国新闻社招聘Python中的JSON工具库 复杂数据类型转换1、json52、dataclasses_json JSON数据校验1、jsonschema2、pydantic3、Voluptuous 在上一节“Python小酷库系列#xff1a;Python中的JSON工具库(1)”中#xff0c;我们介绍了“普通玩家”和“高性能玩家”常用的JSON工具库#xff0… Python中的JSON工具库 复杂数据类型转换1、json52、dataclasses_json JSON数据校验1、jsonschema2、pydantic3、Voluptuous 在上一节“Python小酷库系列Python中的JSON工具库(1)”中我们介绍了“普通玩家”和“高性能玩家”常用的JSON工具库本节我们将拓宽视野从功能性的角度介绍一些Python中的JSON工具库。
复杂数据类型转换
1、json5
json5 是 JSON 的超集允许更宽松的语法如允许注释、单引号、不加引号的键等适合人类书写配置文件。json5 库提供了对 JSON5 格式的解析支持。 安装
pip install json5基本使用
import json5
# JSON5 字符串包含注释、单引号、不加引号的键等
json5_str
{// 这是一个注释unquotedKey: value,quotedKey: 123,trailingComma: true,
}# 解析 JSON5 字符串
data json5.loads(json5_str)
print(data)
# 输出: {unquotedKey: value, quotedKey: 123, trailingComma: True}json5 库支持的扩展语法解析
特性说明注释支持 // 单行注释 和 /* */ 多行注释尾逗号允许最后一个元素后写逗号单引号字符串‘text’ 与 “text” 都合法未加引号的键允许键名不加引号如 foo: 1十六进制数字支持 0x1234 数字表示正负号数字支持 1、-2多行字符串可以使用 \ 跨行字符串数字中的下划线如 1_000_000提高可读性
写入 JSON5 数据 虽然 json5 支持读取 JSON5 文件但并不支持将 Python 对象序列化为 JSON5 格式即没有 json5.dumps() 带有 JSON5 特性的输出功能。它只能写成标准 JSON
data {foo: bar}
print(json5.dumps(data)) # 输出: {foo: bar}2、dataclasses_json
dataclasses-json主要用于dataclasses 的 JSON 序列化/反序列化它还支持dataclasses与dict类型的互相转化 是 dataclasses 的一个强力补丁库。 安装
pip install dataclasses-json基本使用
from dataclasses import dataclass
from dataclasses_json import dataclass_jsondataclass_json
dataclass
class User:id: intname: struser User(id1, nameAlice)# 序列化为 JSON 字符串
json_str user.to_json()
print(json_str) # {id: 1, name: Alice}# 反序列化为 Python 对象
new_user User.from_json({id: 2, name: Bob})
print(new_user.name) # Bob# 转为字典
print(user.to_dict()) # {id: 1, name: Alice}# 从字典创建
u User.from_dict({id: 3, name: Carol})
print(u)嵌套结构支持
dataclass_json
dataclass
class Address:city: strzipcode: strdataclass_json
dataclass
class Person:name: straddress: Addressp Person(nameTom, addressAddress(cityNY, zipcode10001))print(p.to_json())
# {name: Tom, address: {city: NY, zipcode: 10001}}# 自动反序列化嵌套结构
data Person.from_json({name: Amy, address: {city: LA, zipcode: 90001}})
print(data.address.city) # LA转换配置 config函数可以用于配置字段的类型和别名等。
dataclass_json
dataclass
class Data:user_id: int config(field_nameuserId)time: datetime config(encoderdatetime.isoformat,decoderdatetime.fromisoformat,mm_fieldfields.DateTime())d Data(user_id1001, timedatetime(2024, 1, 1, 12, 0))
print(d.to_json()) # {userId: 1001,time:2024-01-01T12:00:00}JSON数据校验
1、jsonschema
jsonschema 是 Python 中用于JSON 数据结构验证的官方实现之一遵循 JSON Schema 标准可以验证 JSON 数据是否符合你定义的“规则/结构”。 安装
pip install jsonschema基本使用
from jsonschema import validate
from jsonschema.exceptions import ValidationError# 定义 JSON Schema结构规则
schema {type: object,properties: {name: {type: string},age: {type: integer, minimum: 0},},required: [name, age]
}# 要校验的 JSON 数据
data {name: Alice,age: 30
}try:validate({name: Bob}, schema)
except ValidationError as e:print(校验失败:, e.message)
常见规则示例
{type: object,properties: {username: {type: string, minLength: 3, pattern: ^[a-zA-Z0-9_]$},age: {type: integer, minimum: 0, maximum: 120},email: {type: string, format: email},tags: {type: array,items: {type: string},maxItems: 5},active: {type: boolean}},required: [username, email]
}**自定义规则 **
from jsonschema import Draft7Validator, FormatCheckerschema {type: object,properties: {phone: {type: string, format: phone}}
}# 添加自定义格式检查器
FormatChecker.cls_checks(phone)
def is_phone(value):import rereturn bool(re.match(r^\d{11}$, value))data {phone: 13800138000}validate(data, schema, format_checkerFormatChecker())数组验证
schema {type: array,items: {type: number},minItems: 1,uniqueItems: True
}validate([1, 2, 3], schema) # 正确
validate([], schema) # 失败元素太少2、pydantic
Pydantic 是 Python 中最流行的数据验证和数据模型库它的功能完全有必要另开一篇文章来详细讨论这里仅仅介绍一下它在JSON 数据校验中的使用。 安装
pip install pydantic基本使用
from pydantic import Fieldclass Product(BaseModel):name: str Field(..., min_length3)price: float Field(..., gt0, lt10000)# 自动校验 JSON 字段
try:Product.model_validate({name: P, price: -10})
except ValidationError as e:print(e)数组与复杂结构
from typing import Listclass Tag(BaseModel):name: strclass Post(BaseModel):title: strtags: List[Tag]post_data {title: My Post,tags: [{name: Python}, {name: FastAPI}]
}post Post.model_validate(post_data)
print(post.tags[0].name) # Python自定义校验器
from pydantic import field_validatorclass User(BaseModel):username: strfield_validator(username)def no_spaces(cls, v):if in v:raise ValueError(username cant contain spaces)return v3、Voluptuous
Voluptuous 是一个用于 Python 数据校验的库语法灵活、结构清晰不同于jsonschema 所遵循JSON Schema 标准它采用的是「函数式」「声明式」风格。 安装
pip install voluptuous基本使用
from voluptuous import Schema, Required, All, Length, Range,MultipleInvalidschema Schema({Required(name): All(str, Length(min2)),Required(age): All(int, Range(min0, max120)),email: str,
})data {name: Alice,age: 30,email: aliceexample.com
}try:schema({name: A, age: -1})
except MultipleInvalid as e:print(校验失败:, e)常用的构造器和校验器主要有
校验器功能Required(…)必须字段Optional(…)可选字段All(…)多重条件组合校验器Length(min, max)字符串或列表长度限制Range(min, max)数值范围限制Match(r’^\w$)正则匹配In([…])枚举值必须属于其中之一Any(A, B)多个类型之一[type]列表中每一项的类型{str: int}键值类型均为特定类型的 dict
嵌套结构与数组校验
config_schema Schema({Required(host): str,Required(port): All(int, Range(min1024, max65535)),debug: bool,users: [{Required(name): str,email: str}]
})config {host: localhost,port: 8000,debug: True,users: [{name: admin, email: adminexample.com}]
}print(config_schema(config))自定义验证规则
from voluptuous import Invaliddef is_even(v):if v % 2 ! 0:raise Invalid(必须为偶数)return vschema Schema({number: is_even})
print(schema({number: 4}))
# print(schema({number: 5})) # 报错