Pydantic 全面指南:从入门到高级应用

Pydantic 简介

1.1 Pydantic 是什么?

Pydantic 是一个用于数据验证和设置管理的 Python 库。它通过 Python 类型注解来定义数据模型,并提供了强大的数据验证功能。Pydantic 的主要目标是确保数据在输入和输出时的一致性和有效性。它广泛应用于各种 Python 项目中,特别是在需要处理复杂数据结构和确保数据完整性的场景中。

Pydantic 的核心功能包括:

  • 数据验证:确保输入数据符合预定义的类型和结构。
  • 序列化:将复杂的数据结构转换为 Python 数据类型,便于处理和传输。
  • 错误处理:提供详细的错误信息,帮助开发者快速定位和修复问题。
  • 配置管理:支持通过环境变量等方式管理配置,提高应用的可配置性。

1.2 Pydantic 的主要特性

Pydantic 以其高效、灵活和易用性著称,以下是其主要特性:

  • 类型注解支持:Pydantic 充分利用 Python 的类型注解,使得数据模型的定义简洁明了。
  • 高性能:Pydantic 的核心验证逻辑是用 Rust 编写的,这使得它在数据验证方面表现出色,速度快于许多其他 Python 数据验证库。
  • JSON Schema 生成:Pydantic 模型可以自动生成 JSON Schema,便于与其他工具和系统集成。
  • 严格模式和宽松模式:Pydantic 支持严格模式(strict=True)和宽松模式(strict=False),在严格模式下,数据不会被自动转换,而在宽松模式下,Pydantic 会尝试将数据转换为正确的类型。
  • 数据类支持:Pydantic 支持标准库中的数据类(dataclasses)和 TypedDict,提供更灵活的数据结构定义。
  • 自定义验证器和序列化器:Pydantic 允许开发者自定义验证器和序列化器,以满足特定的数据处理需求。
  • 生态系统丰富:Pydantic 被广泛应用于各种项目中,包括 FastAPI、Hugging Face、Django Ninja、SQLModel 和 LangChain 等知名库。
  • 经过实战测试:Pydantic 每月被下载超过 7000 万次,被所有 FAANG 公司和纳斯达克 25 家最大公司中的 20 家使用,证明了其可靠性和广泛的应用场景。

通过这些特性,Pydantic 为 Python 开发者提供了一个强大而灵活的工具,用于处理数据验证和解析,极大地简化了数据处理的复杂性。

安装与迁移

2.1 安装 Pydantic

要安装 Pydantic,你可以使用 pip 包管理器。以下是安装 Pydantic 的命令:

pip install pydantic

Pydantic 还支持通过 Conda 进行安装,如果你使用的是 Anaconda 或 Miniconda,可以使用以下命令:

conda install -c conda-forge pydantic

安装完成后,你可以在 Python 脚本中导入 Pydantic 并开始使用它。例如:

from pydantic import BaseModelclass User(BaseModel):id: intname: struser = User(id=1, name='John Doe')
print(user)

这将输出一个包含用户 ID 和名称的 Pydantic 模型实例。

2.2 从 Pydantic V1 迁移到 V2

Pydantic V2 引入了一些重大的变化和改进,因此在从 V1 迁移到 V2 时,需要注意以下几点:

  1. 配置类:Pydantic V2 中,配置类 Config 被移除,取而代之的是直接在模型上使用类属性。例如:
from pydantic import BaseModelclass User(BaseModel):id: intname: strclass Config:arbitrary_types_allowed = True

在 V2 中,你可以这样写:

from pydantic import BaseModelclass User(BaseModel):id: intname: strarbitrary_types_allowed = True
  1. 验证器:Pydantic V2 中,验证器的语法有所变化。例如,V1 中的验证器:
from pydantic import BaseModel, validatorclass User(BaseModel):id: intname: str@validator('name')def check_name(cls, v):if len(v) < 3:raise ValueError('Name too short')return v

在 V2 中,你可以这样写:

from pydantic import BaseModel, field_validatorclass User(BaseModel):id: intname: str@field_validator('name')def check_name(cls, v):if len(v) < 3:raise ValueError('Name too short')return v
  1. 字段类型:Pydantic V2 对字段类型的处理更加严格,一些在 V1 中允许的类型在 V2 中可能不被支持。因此,在迁移时需要仔细检查每个字段的类型定义。

  2. 性能优化:Pydantic V2 在性能上有了显著的提升,特别是在数据验证和序列化方面。因此,迁移到 V2 后,你可能会注意到应用程序的性能有所改善。

通过以上步骤,你可以顺利地将你的项目从 Pydantic V1 迁移到 V2,并享受新版本带来的改进和优化。

基本使用

3.1 定义数据模型

在使用Pydantic进行数据验证之前,首先需要定义数据模型。Pydantic通过继承BaseModel类来实现这一点。以下是一个简单的示例,展示了如何定义一个包含基本数据类型的数据模型。

from pydantic import BaseModel
from typing import Listclass EmployeeModel(BaseModel):name: strusername: strsalary: inthabits: List[str]

在这个示例中,我们定义了一个名为EmployeeModel的类,它继承自BaseModel。该类包含四个字段:nameusernamesalaryhabits。每个字段都通过类型注解(type annotation)指定了其数据类型。

3.2 数据验证示例

Pydantic的核心功能之一是数据验证。一旦定义了数据模型,Pydantic会自动验证输入数据是否符合模型定义的类型和结构。以下是一个验证示例:

employee = EmployeeModel(name='Bar', username='bar', salary=1000, habits=[])
print(employee)

在这个示例中,我们创建了一个EmployeeModel的实例,并传入相应的字段值。Pydantic会自动验证这些值是否符合模型定义的类型。如果验证通过,实例将被成功创建。

如果输入数据不符合模型定义的类型,Pydantic会抛出ValidationError异常,并提供详细的错误信息。例如:

try:employee = EmployeeModel(name='Bar', username='bar', salary='secret', habits=[])
except ValidationError as e:print(e)

在这个示例中,我们将salary字段设置为字符串'secret',这不符合模型定义的int类型。因此,Pydantic会抛出ValidationError异常,并显示详细的错误信息:

1 validation error for EmployeeModel
salaryvalue is not a valid integer (type=type_error.integer)

3.3 处理外部数据

Pydantic不仅可以在创建模型实例时进行数据验证,还可以处理外部数据,如JSON格式的数据。以下是一个处理外部数据的示例:

import json# 假设我们有一个JSON字符串
json_data = '{"name": "Bar", "username": "bar", "salary": "1000", "habits": []}'# 将JSON字符串解析为Python字典
data = json.loads(json_data)# 使用字典数据创建模型实例
employee = EmployeeModel(**data)
print(employee)

在这个示例中,我们首先将JSON字符串解析为Python字典,然后使用字典数据创建EmployeeModel的实例。Pydantic会自动验证字典中的数据是否符合模型定义的类型。即使salary字段在JSON字符串中是字符串类型,Pydantic也会尝试将其转换为整数类型。

通过这种方式,Pydantic可以方便地处理来自外部数据源的数据,并确保数据的完整性和一致性。

高级功能

4.1 自定义验证器

Pydantic 提供了强大的数据验证功能,其中自定义验证器是一个非常重要的特性。通过自定义验证器,开发者可以实现复杂的验证逻辑,确保数据的完整性和准确性。

4.1.1 使用 @validator 装饰器

Pydantic 提供了 @validator 装饰器,用于在模型字段上定义自定义验证逻辑。以下是一个简单的示例:

from pydantic import BaseModel, validator, ValidationErrorclass UserModel(BaseModel):name: strage: int@validator('name')def name_must_contain_space(cls, v):if ' ' not in v:raise ValueError('must contain a space')return v.title()@validator('age')def age_must_be_positive(cls, v):if v <= 0:raise ValueError('must be a positive integer')return vtry:user = UserModel(name="john doe", age=-1)
except ValidationError as e:print(e)

在这个示例中,我们定义了两个验证器:

  1. name_must_contain_space:确保 name 字段包含空格。
  2. age_must_be_positive:确保 age 字段是正整数。
4.1.2 验证器的参数

@validator 装饰器支持多个参数,用于控制验证器的行为:

  • pre: 如果设置为 True,验证器将在字段验证之前执行。
  • each_item: 如果设置为 True,验证器将应用于列表或字典中的每个元素。
  • always: 如果设置为 True,验证器将始终执行,即使字段没有值。
from pydantic import BaseModel, validatorclass UserModel(BaseModel):name: strhobbies: list@validator('hobbies', each_item=True)def check_hobbies_not_empty(cls, v):if not v:raise ValueError('hobby cannot be empty')return v

在这个示例中,check_hobbies_not_empty 验证器将应用于 hobbies 列表中的每个元素,确保每个爱好不为空。

4.2 嵌套模型

Pydantic 支持嵌套模型,这使得定义复杂的数据结构变得非常方便。嵌套模型可以包含其他模型作为字段,从而实现层次化的数据结构。

4.2.1 定义嵌套模型

以下是一个嵌套模型的示例:

from pydantic import BaseModelclass Address(BaseModel):street: strcity: strstate: strzip_code: strclass User(BaseModel):name: straddress: Addressuser = User(name="John Doe", address={"street": "123 Elm St", "city": "Springfield", "state": "IL", "zip_code": "62704"})
print(user)

在这个示例中,User 模型包含一个 Address 模型作为其 address 字段。

4.2.2 嵌套模型的验证

嵌套模型的验证是自动进行的。如果嵌套模型的字段不符合定义的类型或验证规则,Pydantic 将抛出 ValidationError

try:user = User(name="John Doe", address={"street": "123 Elm St", "city": "Springfield", "state": "IL", "zip_code": "invalid"})
except ValidationError as e:print(e)

在这个示例中,zip_code 字段不符合定义的类型,因此会抛出验证错误。

4.3 配置选项

Pydantic 提供了多种配置选项,用于自定义模型的行为。这些配置选项可以在模型的 Config 类中定义。

4.3.1 常用的配置选项
  • allow_mutation: 如果设置为 False,模型实例将是不可变的。
  • extra: 控制如何处理未定义的字段。可选值包括 allowforbidignore
  • validate_all: 如果设置为 True,所有字段在实例化时都将被验证。
  • error_msg_templates: 自定义错误消息模板。
from pydantic import BaseModelclass User(BaseModel):name: strage: intclass Config:allow_mutation = Falseextra = 'forbid'validate_all = Trueuser = User(name="John Doe", age=30)
try:user.age = 31  # 这将引发错误,因为 allow_mutation 设置为 False
except TypeError as e:print(e)

在这个示例中,allow_mutation 设置为 False,因此 user 实例是不可变的。

4.3.2 自定义错误消息

可以通过 error_msg_templates 自定义错误消息:

from pydantic import BaseModel, validatorclass User(BaseModel):name: strage: intclass Config:error_msg_templates = {'value_error.any_str.max_length': '字符串长度不能超过 {limit_value} 个字符','value_error.any_str.min_length': '字符串长度不能少于 {limit_value} 个字符'}@validator('name')def name_length(cls, v):if len(v) > 10:raise ValueError('name too long')return v

在这个示例中,我们自定义了两个错误消息模板,用于处理字符串长度的错误。

通过这些高级功能,Pydantic 提供了强大的数据验证和自定义能力,使得开发者可以轻松处理复杂的数据结构和验证逻辑。

实际应用场景

5.1 Web 开发

在Web开发中,Pydantic可以作为数据验证和序列化的强大工具。特别是在使用FastAPI这样的现代Web框架时,Pydantic的数据模型可以直接用于定义API的请求和响应模型。以下是一个简单的示例,展示了如何在FastAPI中使用Pydantic模型:

from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = None@app.post("/items/")
async def create_item(item: Item):return item

在这个示例中,Item类继承自Pydantic的BaseModel,用于定义一个数据模型。FastAPI使用这个模型来验证和解析传入的JSON数据。这种方式不仅简化了数据验证的代码,还使得API文档(如Swagger UI)能够自动生成,极大地提高了开发效率。

5.2 API 开发

Pydantic在API开发中的应用非常广泛,特别是在需要严格数据验证和序列化的场景。例如,开发一个RESTful API时,可以使用Pydantic来定义请求体和响应体的数据结构。以下是一个使用Pydantic进行API开发的示例:

from pydantic import BaseModel
from typing import Listclass User(BaseModel):id: intname: stremail: strclass UserList(BaseModel):users: List[User]def get_users() -> UserList:# 模拟从数据库获取用户数据users_data = [{"id": 1, "name": "Alice", "email": "alice@example.com"},{"id": 2, "name": "Bob", "email": "bob@example.com"}]return UserList(users=users_data)

在这个示例中,UserUserList类分别定义了用户和用户列表的数据结构。通过这种方式,可以确保API的输入和输出数据的一致性和有效性。

5.3 数据处理

Pydantic在数据处理方面也非常有用,特别是在需要对复杂数据结构进行验证和转换的场景。例如,处理从外部系统导入的数据时,可以使用Pydantic来确保数据的正确性和完整性。以下是一个数据处理的示例:

from pydantic import BaseModel, ValidationError
from typing import Dict, Anyclass Product(BaseModel):id: intname: strprice: floatdef process_product_data(data: Dict[str, Any]) -> Product:try:product = Product(**data)return productexcept ValidationError as e:print(e.errors())raise# 示例数据
product_data = {"id": "123",  # 这里故意使用字符串类型来测试验证"name": "Laptop","price": 999.99
}try:product = process_product_data(product_data)print(product)
except ValidationError as e:print("数据验证失败:", e)

在这个示例中,Product类定义了产品的数据结构。process_product_data函数用于处理传入的数据,并使用Pydantic进行验证。如果数据不符合定义的结构,Pydantic会抛出ValidationError,从而确保数据的正确性。

通过这些示例,可以看出Pydantic在Web开发、API开发和数据处理等多个实际应用场景中的强大功能和灵活性。

Pydantic 的生态系统

Pydantic 不仅是一个强大的数据验证和设置管理工具,它还拥有一个丰富的生态系统,与其他流行的 Python 库和框架紧密集成,提供了更广泛的应用场景和更高效的工作流程。以下是 Pydantic 生态系统中的一些关键组成部分。

6.1 集成 FastAPI

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,基于标准的 Python 类型提示,并利用 Pydantic 进行数据验证和设置管理。FastAPI 与 Pydantic 的集成是其高性能和易用性的关键因素之一。

示例代码
from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strdescription: str = Noneprice: floattax: float = None@app.post("/items/")
async def create_item(item: Item):return item

在这个示例中,Item 模型继承自 BaseModel,并在 FastAPI 的路由中用于验证和解析请求数据。FastAPI 自动生成 OpenAPI 文档,其中包括 Pydantic 模型的详细信息。

6.2 使用 Swagger 和 Redocly

Swagger 和 Redocly 是用于 API 文档生成的流行工具。由于 FastAPI 基于 Pydantic 模型自动生成 OpenAPI 文档,因此可以轻松地与 Swagger 和 Redocly 集成,提供交互式的 API 文档。

访问文档
  • Swagger UI: 通过访问 /docs 路径,可以查看和测试 API。
  • Redoc: 通过访问 /redoc 路径,可以查看更详细的 API 文档。

6.3 其他工具和插件

Pydantic 的生态系统还包括许多其他工具和插件,这些工具和插件进一步扩展了 Pydantic 的功能和应用场景。

1. Pydantic-SQLAlchemy

Pydantic-SQLAlchemy 是一个将 Pydantic 与 SQLAlchemy ORM 集成的库,使得从数据库模型到 Pydantic 模型的转换变得更加简单和高效。

2. Pydantic-Factories

Pydantic-Factories 提供了一种简单的方式来生成 Pydantic 模型的测试数据,这对于单元测试和集成测试非常有用。

3. Pydantic-Settings

Pydantic-Settings 是一个用于管理应用程序设置的库,它基于 Pydantic 的设置管理功能,提供了更高级的设置管理选项,如环境变量解析、.env 文件支持等。

4. Pydantic-Utils

Pydantic-Utils 包含了一系列实用工具和函数,用于增强 Pydantic 的功能,如自定义验证器、模型转换等。

通过这些工具和插件,Pydantic 不仅限于数据验证和设置管理,还可以扩展到更广泛的开发场景,提供更高效和灵活的开发体验。

Pydantic 的社区和资源

7.1 官方文档

Pydantic 的官方文档是学习和使用 Pydantic 的最佳资源。文档详细介绍了 Pydantic 的各个方面,包括安装、基本概念、数据验证、序列化、迁移指南、高级功能以及实际应用案例。以下是官方文档的一些关键部分:

  • 安装指南:提供了详细的安装步骤,包括通过 pip 安装和从源码安装的方法。
  • 快速入门:通过简单的示例帮助用户快速上手 Pydantic。
  • 模型定义:详细介绍了如何定义数据模型,包括字段类型、默认值、验证器等。
  • 高级功能:涵盖了自定义验证器、嵌套模型、配置选项等高级功能的使用方法。
  • 迁移指南:指导用户从 Pydantic V1 迁移到 V2,详细说明了版本之间的差异和迁移步骤。
  • API 文档:提供了 Pydantic 所有模块和类的详细 API 参考。

官方文档的地址是:Pydantic 官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

clean code-代码整洁之道 阅读笔记(第十二章)

第十二章 系统 12.1 通过选进设计达到整洁目的 Kent Beck关于简单设计的四条规则&#xff0c;对于创建具有良好设计的软件有着莫大的帮助。 据Kent所述&#xff0c;只要遵循以下规则&#xff0c;设计就能变得"简单"&#xff1a;运行所有测试&#xff1b;不可重复&…

大疆无人机航点飞行KMZ文件提取航点坐标

一、需要插件 <!-- 解析KMZ航线--><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.1.4</version></dependency><dependency><groupId>dom4j</groupId><a…

学习java第一百零七天

解释JDBC抽象和DAO模块 使用JDBC抽象和DAO模块&#xff0c;我们可以确保保持数据库代码的整洁和简单&#xff0c;并避免数据库资源关闭而导致的问题。它在多个数据库服务器给出的异常之上提供了一层统一的异常。它还利用Spring的AOP模块为Spring应用程序中的对象提供事务管理服…

计算机网络(概述)

该笔记为湖科大计算机网络相关笔记、教材参考计算机网络第六版 湖科大计算机网络 计算机网络概述 因特网概述 Internet和internet的区别 internet&#xff1a;只要是计算机与计算机连接&#xff0c;形成了网络&#xff0c;就可以叫internet Internet&#xff1a;泛指全世界的…

Excel 导入实例

在上一节的基础上&#xff0c;本文演示下如何导入excel数据。 Excel导入操作指导 继承ocean-easyexcel SDK&#xff0c;上一节打包生成 <dependency><groupId>com.angel.ocean</groupId><artifactId>ocean-easyexcel</artifactId><version…

晶谷电子器件烧结封装介质材料 绝缘用晶谷低温封接环保玻璃粉 耐压高

电子器件烧结封装介质材料是用于保护和封装电子器件的关键材料。 常见的电子器件烧结封装介质材料包括以下几种&#xff1a; 1. 陶瓷材料&#xff1a;具有良好的绝缘性能、耐高温性能和机械强度。 2. 高分子材料&#xff1a;如环氧树脂等&#xff0c;具有良好的柔韧性和耐湿…

k8s离线部署nginx

1. 拉取nginx离线包到本地 sudo docker save nginx:latest -o nginx.tar 2. 导入nginx image到k8s命名空间中 sudo ctr -n k8s.io images import nginx.tar 3. 编辑nginx.yaml apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deployment spec:selector:match…

GitHub的基本使用方法

GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;提供了版本控制功能、代码托管服务、协作功能等。以下是GitHub的基本使用方法&#xff1a; 注册并登录&#xff1a;首先&#xff0c;访问GitHub官网&#xff08;https://github.com/&#xff09;并点击右上角的"…

springCloudAlibaba之链路追踪组件---skywalking

skywalking skywalking skywalking 介绍 对于一个大型的几十个、几百个微服务构成的微服务架构系统&#xff0c;通常会遇到下面一些问题&#xff0c;比如&#xff1a;如何串联整个调用链路、快速定位问题&#xff1f;如何明确各个微服务之间的依赖关系&#xff1f;如何进行各个…

【C语言】解决C语言报错:Array Index Out of Bounds

文章目录 简介什么是Array Index Out of BoundsArray Index Out of Bounds的常见原因如何检测和调试Array Index Out of Bounds解决Array Index Out of Bounds的最佳实践详细实例解析示例1&#xff1a;访问负索引示例2&#xff1a;访问超出上限的索引示例3&#xff1a;循环边界…

ArcGIS实现不同地块分类与面积汇总

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 我们要做一个不同地块面积汇总&#xff01; 你有一批地块&#xff0c;不同面积&#xff0c;我们需…

Redis单例部署

目录 1. 概述2. 参考3. 环境4. 部署4.1 操作系统4.1.1 修改系统参数4.1.2 关闭透明大页内存4.1.3 修改系统限制 4.2 安装Redis4.2.1 下载Redis4.2.2 创建redis账号4.2.3 添加Redis环境变量4.2.4 创建Redis使用目录4.2.5 安装Redis4.2.6 手动修改配置文件&#xff08;**可跳过&a…

javaSE字符串学习笔记

API和API帮助文档 API API(Application Programming Interface)&#xff1a;应用程序编程接口简单理解&#xff1a;API酒啊别人已经写好的东西&#xff0c;我们不需要自己编写&#xff0c;直接使用即可。 API这个术语在编程圈中非常常见.我第一次接触API这个词语是在大一下。老…

【办公技巧】如何编辑带有限制编辑密码的PDF文件?

PDF文件打开之后发现设置了限制编辑&#xff0c;功能栏中的编辑按钮都是灰色的&#xff0c;导致PDF文件里的内容无法编辑。那么带有限制编辑的PDF文件&#xff0c;如何编辑&#xff1f;今天分享两个方法。 方法一&#xff1a; 我们可以将PDF文件转换成其他格式&#xff0c;有…

简单理解爬虫的概念

简单来说&#xff1a; 爬虫&#xff0c;即网络蜘蛛&#xff0c;是伪装成客户端与服务器进行数据交互的程序。 代码 代码教程分享&#xff08;无偿&#xff09;&#xff1a; 思路 1.获取网页的源码 pythondef askURL(url):head{"User-Agent":"Mozilla/5.0 (L…

SQL综合查询-学校教务管理系统数据库

一、一个完整的数据查询语句的格式 SELECT 【ALL|DISTINCT】<目标列表达式>【&#xff0c;<目标列表达式2>&#xff0c;...】 FROM <表名或视图名1>【&#xff0c;<表名或视图名2>&#xff0c;...】 【WHERE <元组选择条件表达式>】 【GROUP…

利用streamlit开发大模型API调用对话网页应用

利用streamlit开发大模型API调用对话网页应用 介绍 Streamlit是一个用于构建数据应用的开源框架&#xff0c;其简单易用的界面使得数据科学家和开发人员能够快速创建交互式应用。而OpenAI API则提供了强大的语言模型&#xff0c;可以生成自然语言响应。将这两者结合起来&…

【Computer Security : Art and Science】【Second Edition】

以下是书的目录&#xff1a; #### 第一部分&#xff1a;介绍 1. 计算机安全概述 - 1.1 基本组件 - 1.2 威胁 - 1.3 策略与机制 - 1.4 假设与信任 - 1.5 保证 - 1.6 操作问题 - 1.7 人为问题 - 1.8 综合概述 - 1.9 总结 - 1.10 研究问…

redis-基础篇(2)

黑马redis-基础篇笔记 3. redis的java客户端-Jedis 在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;https://redis.io/docs/clients/ 标记为❤的就是推荐使用的java客户端&#xff0c;包括&#xff1a; Jedis和Lettuce&#xff1a;这两个主要是提供了Redi…

半结构化数据

定义&#xff1a; 半结构化数据是一种数据类型&#xff0c;它既不是完全结构化也不是完全非结构化。 特点&#xff1a; 元素组合、元素可变性、位置和顺序可变、重复性、可嵌套 应用&#xff1a; 网页内容、xml文档、json对象、电子邮件、日志文件 半结构化可转换成结构化…