Python序列化模型数据为JSON

序列化sklearn model 为 json (sklearn-json) sklearn-json前言安装 sklearn-json使用序列化模型为json反序列化参考 前言 需求:导出sklearn训练好的算法模型为json格式,方便在不同编程语言间传递数据。 方案:使用 sklearn-json 安装 sklearn-json pip install sklearn-json 注: 需要 scikit-learn >= 0.21.3 使用 序列化模型为j... 阅读详情

相信使用Python做Web开发的朋友都会遇到这样1个问题,那就是在项目开发中使用模型框架,比如SQLAlchemy、Peewee,我们在做RESTful接口时如何将这些模型序列化为JSON数据。
关于这个问题,跟隔壁那位搞Python的哥们有关系。我不得不佩服这位哥们竟然自己写了1套ORM框架,而且用起来的那么遛,不得不让我汗颜。
但是,在给前端提供接口的时候,如何序列化为JSON数据确实困扰了我们那么一阵子,毕竟占据我们很大一部分时间来进行序列化操作。
这里,我们使用peewee来定义1个简单的例子来说明:

from peewee import SqliteDatabase  
from peewee import Model, CharField, DateField, BooleanField, ForeignKeyField  

db = SqliteDatabase('dev.sqlite3')  

class BaseModel(Model):  
    class Meta:  
        database = db  

class Person(BaseModel):  
    name = CharField(max_length= 20)  
    birthday = DateField()  
    sex = BooleanField()  

class Pet(BaseModel):  
    owner = ForeignKeyField(Person, related_name= 'pets')  
    name = CharField(max_length= 10)  
    animal_type = CharField(max_length= 20)

在这里我们定义了Person和Pet这2个模型,每个Person可能有1个Pet的宠物。
我们插入一些数据,现在假设我们现在有如下的数据:

  
sqlite> select * from person;  
1|Bob|1960-01-15|1  
2|Grandma|1935-03-01|0  
3|Herb|1950-05-05|1  
sqlite> select * from pet;  
1|1|Kitty|cat  
2|3|Fido|dog  
3|3|Mittens|cat  
4|2|Jack|cat  

现在,我们假设我们接口需要返回的接口是每个用户的名称、生日及其对应的宠物的信息。
我们可以通过连表的方式轻松的获取到我们需要的数据:

query=Person.select(Person,Pet).join(Pet)

那么我们怎么将这个模型数据转换为我们需要的JSON数据呢?一般情况下,我们会这样操作:

data = []  
for person in query.aggregate_rows():  
    d={}  
    d['username'] = person.name  
    d['birthday'] = person.birthday  
    d['pet'] = []  
    for pet in person.pets:  
        o = {}  
        o['name'] = pet.name  
        o['animal_type'] = pet.animal_type  
        d['pet'].append(o)  
    data.append(d)

最后我们将得到如下的结果:

[{'birthday': datetime.date(1960, 1, 15),  
  'pet': [{'animal_type': u'cat', 'name': u'Kitty'}],  
  'username': u'Bob'},  
 {'birthday': datetime.date(1950, 5, 5),  
  'pet': [{'animal_type': u'dog', 'name': u'Fido'},  
   {'animal_type': u'cat', 'name': u'Mittens'}],  
  'username': u'Herb'},  
 {'birthday': datetime.date(1935, 3, 1),  
  'pet': [{'animal_type': u'cat', 'name': u'Jack'}],  
  'username': u'Grandma'}]  

可以看到,这么1个简单的例子,我们已经对序列化操作处理的已经够呛的。对于那些更为复杂的模型,我们预计只有哭的份了。
因此,我们希望能找到1个库可以减轻我们的工作量,于是我们找到了1个marshallow的库。
下面我们来说说如何使用marshallow来减轻序列化模型的工作量。
主要包括如下2个步骤:

  • 定义模式
  • 序列化模型

下面我们分别来看看。

定义模式

如果你使用过Flask-RESTful,你应该知道该库提供了1个marshal_with的函数。其中我们就需要定义我们给定字段返回的数据类型,但是Flask-RESTful没有提供字段不同返回的操作。
我们通过如下的方式导入模式及其对应的字段:

from marshmallow import Schema, fields

接下来,我们定义1个继承自Schema的类,然后定义其对应的字段:

class PetSchema(Schema):  
    name = fields.String()  
    animal_type = fields.String()  

class PersonSchema(Schema):  
    name = fields.String(dump_to = 'username')  
    birthday = fields.Date()  
    pets = fields.Nested(PetSchema,dump_to='pet',many=True)

由于这里,我们将用户的name属性修改为username,因此我们需要在字段中使用dump_to参数将其修改为我们需要的字段。另外,用户的pet字段对应的是宠物的信息,因此我们采用嵌套模式来实现这样需求。
在这里,我们在Nested字段中传入many参数,因此输出的结果可能有多个,不然得到的结果将为空。而我们定义的pets将访问Person实例的pets属性,通过这个外键从而访问到Pet的内容。

序列化模型

上面我们已经定义好了我们的模式了,下一步是序列化模型的操作了。
我们可以这样来操作:

query=Person.select(Person, Pet).join(Pet)

接着,我们实例化我们的模式,然后传入需要序列化的模型:

person, error = PersonSchema(many = True).dumps(query.aggregate_rows())

在这里,我们调用PersonSchema实例的dumps来生成JSON数据,另外它还有1个dump方法用于生成Python对象。由于我们的渲染的数据有多条,因此我们需要在实例化PersonSchema类时传入关键字参数many为True,不然没有任何数据。
通过这种方式,PersonSchema会查看它自己的属性,将数据模型中对应的数据先序列化出来,然后是查询嵌套模式中的字段,如果符合对应的名称则将其序列化出来,最后我们将得到这样的数据:

[  
    {  
        "username": "Bob",  
        "pet": [  
            {  
                "animal_type": "cat",  
                "name": "Kitty"  
            }  
        ],  
        "birthday": "1960-01-15"  
    },  
    {  
        "username": "Herb",  
        "pet": [  
            {  
                "animal_type": "dog",  
                "name": "Fido"  
            },  
            {  
                "animal_type": "cat",  
                "name": "Mittens"  
            }  
        ],  
        "birthday": "1950-05-05"  
    },  
    {  
        "username": "Grandma",  
        "pet": [  
            {  
                "animal_type": "cat",  
                "name": "Jack"  
            }  
        ],  
        "birthday": "1935-03-01"  
    }  
]  

可以看到,通过marshallow得到的结果与之前我们编写的序列化操作的结果是一样的。
不得不说,marshallow这个库对于序列化模型其实挺实用的。当然对于复杂的模型,我们需要利用合适的方式将其搜索出来,不然还是序列化不了的。

将Python机器学习模型保存为JSON文件 在Python中,我们可以使用pickle模块将模型保存到磁盘上并在需要时重新加载。因此,我们可以使用JSON格式对模型进行序列化,这样就可以在不同的编程语言中安全、方便地重载模型。在本文中,我们学习了如何将机器学习模型保存为JSON文件。通过将模型保存为JSON,我们可以在需要时轻松地重载模型,并在不同的平台上运行它们。语句打开一个名为“model.json”的文件,然后将model_json变量写入该文件中。方法,将clf对象转换为JSON格式,并将结果存储在model_json变量中。 阅读详情

相关推荐

【python】JSON数据 → Python对象(反序列化)

本文介绍了两种在Python中将JSON数据反序列化为Python对象的方法:1)使用dataclass方式,通过json.loads解析JSON后手动创建对象;2)推荐使用Pydantic方式,通过BaseModel自动处理类型转换并提供数据验证功能(如邮箱格式校验、年龄范围检查等)。两种方法都能实现类似JavaBean的功能,但Pydantic提供了更强大的数据验证和类型处理能力,示例展示了如何将包含用户信息的JSON字符串转换为Python对象并访问其属性。

静谧、淡雅 242

pydantic 库(Python 数据接口定义)基本使用指南

pydantic 库(Python 数据接口定义)基本使用指南

墨鸦的博客 1万+

Python JSON数据处理库:JSONModels快速上手指南

在开发中,对数据的结构化定义至关重要。模型定义(Model Definition)允许开发者通过代码清晰地声明数据的结构和类型,进而使数据操作更加安全和高效。对于JSON数据,模型定义变得尤为重要,因为它为JSON数据提供了一种“类型系统”,确保数据的一致性和准确性。模型定义的优势体现在:数据一致性:定义模型后,可以确保处理的数据与预期结构一致,减少数据错误。代码可读性:清晰的数据模型定义有助于其他开发者理解数据结构,提高代码的可维护性。类型检查。

weixin_42577735的博客 773

Python小技巧-model转json、form表单的值自动赋值给model

Python小技巧-model转json、form表单的值自动赋值给model

qianpou的博客 1631

从一个过气考渣的角度看LLM智能化测试用例生成

根据业务需求生成测试用例,会涉及到相关上下文的召回、用例生成等场景。除了用例生成之外,也可以考虑应用LLM进行用例评审。因此,本文将涉及以下内容。

software_test010的博客 827

微信自动化进阶:Python识别特定消息并自动回复(基于win32api控件操作)

本文详细介绍了如何使用Python和win32api实现微信消息的智能监控与自动回复。通过精准识别聊天记录中的特定关键词,结合多级匹配策略和性能优化技巧,构建稳定高效的自动化回复系统,适用于企业客服、个人助手等场景。

weixin_42663213的博客 441

Pydantic系列之序列化

装饰在实例方法或者静态方法,被装饰方法可以是以下四种。默认为PlainSerializer,不走pydantic的序列化逻辑,此时的方法签名只能是1或3,nxt参数为pydantic序列化链mode='wrap’支持上述四个方法签名,可完成前置处理,pydantic序列化逻辑,载返回之前再处理的逻辑。# 下面的装饰器先执行。

峰 5735

大众奥迪诊断不求人:手把手解析SAE J2819(CAN TP2.0)协议报文与连接流程

本文深入解析大众奥迪车型诊断核心标准SAE J2819(CAN TP2.0)协议,详细拆解连接建立流程与报文控制字段。通过实战案例展示通道设置、参数协商等关键步骤,提供诊断设备配置建议和常见故障排查技巧,帮助工程师掌握汽车诊断通信协议的精髓。

weixin_30421809的博客 396

Tortoise ORM 时区体系完全指南:use_tz 与 timezone 配置的深度解析

Tortoise ORM 的时区设计灵感源自 Django,但又保留了自身特色。本文以官方文档 [docs/timezone.rst](https://link.gitcode.com/i/25c749ecd1a97a92e659aaa6ca5ec661) 为骨架,结合 `tortoise/timezone.py`、`tortoise/fields/data.py` 等核心源码,系统讲解 `use

gitblog_00889的博客 1079

草莓成熟度与叶片病虫害智能检测数据集应用全解析

本文深入解析草莓成熟度与叶片病虫害智能检测数据集的应用价值,涵盖从绿草莓到红果转色的完整成熟周期及白粉病、炭疽病等7种病害的精准识别。通过实战案例展示如何提升病害识别率至94%,并介绍数据集的科研价值,包括跨品种迁移学习和多模态数据融合技术。

weixin_28366353的博客 274

05、基于ALV表报实现复选框、全选、取消全选等功能

基于Function ALV实现复选框、全选及取消全选等功能

wo520yl1314的博客 2370

python 序列化 json_Python序列化模型数据为JSON

weixin_39557583的博客 111

51单片机定时器的原理、应用与编程实现

本文系统介绍了51单片机定时器的基本原理与应用。首先阐述了定时器的工作原理,包括定时模式和计数模式的区别。然后详细讲解了定时器的四种工作模式(方式0-方式3)及其适用场景,并分析了相关寄存器(TMOD、TCON、THx/TLx)的功能设置。文章还给出了定时器编程的具体步骤,包括初始化、计数初值计算和示例代码。最后通过LED闪烁、PWM波形产生、脉冲计数等实际应用案例,展示了定时器的多样化应用。掌握这些知识对嵌入式系统开发具有重要意义。

2501_91227323的博客 1523

json无法序列化问题

json无法序列化问题 后端python程序代码大概这样: datas = Recruitment.query.offset(page).limit(limit).all() #数据模型查询出来的数据。 result={‘code’:code, ‘msg’:msg, ‘count’:count, ‘data’:data} return str(result) 浏览器返回的数据如下: 但这不是并不...

qq_26433989的博客 1938

OpenAI Error: 403 Country, region, or territory not supported [Python]

从OpenAI的API服务中获取数据时,由于你所在的国家、地区或领土不被支持,因此请求被拒绝了

suiusoar 5664

32GB Jetson Orin SOM 不能刷机问题排查

拿到了一个新的Orin SOM,当用orin Devkit CVB或定制的CVB不能用Linux_For_Tegra刷机,flash日志(JetPack5.0DP和5.0.1DP都失败了) 2. 确认mb2配置中将CVB的eeprom读取大小设置是否为0 ? 已经确认是正常的 在定制的orin cvb flash上使用Orin devkit som,启动是成功的。但新得到的Orin som并不工作可以排除理由:使用Orin Devkit CVB和Orin SOM(不是Devkit SOM)仍然不能

jzwjzw19900922的博客 1499

Python JSON数据的处理更简单的方式

flyfish

二分掌柜的 1203

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

序列化与反序列化

在日常开发中,会从别的API获取数据或者自己写API提供数据,数据格式一般都是采用JSON格式。这期间就会涉及两个专业术语:• 序列化:将python对象转json• 反序列化:将json转为python对JSON# 序列化computer = {"主机":5000,"显示器":1000,"鼠标":60,"键盘":150}# 反序列化反序列化后,可以对象.属性获取值。Django内置Serializers模块Django内置JsonResponse模块。

wyl9527的博客 754

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python 数据库查询序列化_如何通过带有联接的数据库查询生成嵌套的JSON?使用Python / SQLAlchemy...

小编典典我强烈建议您不要将序列化直接烘焙到模型中,因为您最终将有两个服务请求相同的数据,但是以不同的方式进行序列化(例如,包括更少或更多的嵌套关系以提高性能),您要么最终选择要么(1)测试套件会遗漏许多错误,除非您要逐字检查每个字段,或者(2)序列化的数据量超过所需数量,并且随着应用程序的复杂性扩展,您将遇到性能问题。使用marshmallow-sqlalchemy,您需要为要序列化的每个模型定义...

weixin_33186395的博客 252

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python序列化:pickle、json、joblib

pickle 只能在python中用python文件间序列化,实现了两个python内存数据的交互(可序列化任何对象(类,列表)),可以用于保存、加载模型文件 json 在任何软件间可以在内存数据之间的交互,只能序列化常规的对象(列表 ,字典等),常用于网络请求的序列化 joblib更适合大数据量的模型,且只能往硬盘存储,不能往字符串存储 loads、dumps用于往字符串操作 load、dump用于往文件操作 #!usr/bin/env python #_*_ coding:utf-8 _*.

swai1688的博客 2419

Python序列化和反序列化JSON的方法整理

简单数据类型 对于python的built-in数据类型(string、unicode、int、float、list、tuple、dict),可以直接import json使用json.dumps()序列化和json.loads()来反序列化。 对于自定义类型的数据结构,json模块默认是没法处理的,会抛出异常:TypeError xx is not JSON serializable,此时你需要

yangjiegang8的博客 549

Python序列化实战:pickle模块的深度解析与JSON的抉择指南

本文深入解析Python中pickle模块的序列化机制,对比其与JSON的核心差异及适用场景。通过实际案例展示pickle在保存复杂Python对象(如机器学习模型)时的优势,同时强调JSON在跨语言交互中的不可替代性,为开发者提供序列化方案选型的实用指南。

深未来技术 372

Python数据验证与序列化利器Pydantic详解

数据验证是软件开发中的基础需求,特别是在API开发和数据处理场景中。Pydantic作为Python生态中的类型验证库,通过利用Python类型提示系统,实现了运行时自动数据校验和类型转换。其核心原理是基于类型注解构建数据模型,自动生成验证逻辑,大幅减少手工编写验证代码的工作量。在工程实践中,Pydantic能有效处理JSON序列化/反序列化、嵌套数据结构验证等常见需求,与FastAPI等框架配合使用时尤为高效。对于需要确保数据质量和安全性的Python项目,Pydantic提供了严谨而优雅的解决方案,是处

weixin_30378623的博客 436

Python marshmallow库:灵活的数据序列化与反序列化

更多Python学习内容:ipengtao.com在现代 Web 开发和数据处理项目中,数据序列化和反序列化是不可避免的任务。Python 中的 Marshmallow 库提供了一种简洁且强大的方式来对复杂的数据结构进行序列化(将数据对象转换为JSON或字典)和反序列化(将JSON或字典转换为对象)。无论是在API数据交互中,还是在验证用户输入时,Marshmallow都能提供极高的灵活性和可扩展...

GitHub_miao的博客 952

Pydantic序列化终极指南:Python对象到JSON的完美转换

你是否曾遇到过Python对象转JSON的困境?日期格式混乱、自定义类型无法序列化、嵌套对象处理复杂?Pydantic(数据验证工具,使用Python类型提示)提供了一套完整的序列化解决方案,让Python对象到JSON的转换变得简单高效。本文将深入探讨Pydantic的序列化机制,从基础用法到高级技巧,帮助你掌握Python对象到JSON的完美转换。 读完本文,你将能够: - 熟练使用Pyda...

gitblog_00663的博客 673
上一篇: 使用 Python 读取 8 GB 大小的文件
下一篇: python中神奇的格式化输出
Wang_AI
博客等级 码龄12年 988粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值