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

中国企业网官方网站进入公众号看不到内容

中国企业网官方网站,进入公众号看不到内容,云服务器怎么建网站,咸阳网站建设电话目录 一、为什么要谈 JSON 二、最快速上手:两把钥匙 dumps 与 loads 三、深入 dumps:参数是魔法棒 四、深入 loads:把风险挡在门外 五、文件级序列化:dump 与 load 六、处理中文与编码陷阱 七、异常场景与调试技巧 八、实…

目录

一、为什么要谈 JSON

二、最快速上手:两把钥匙 dumps 与 loads

三、深入 dumps:参数是魔法棒

四、深入 loads:把风险挡在门外

五、文件级序列化:dump 与 load

六、处理中文与编码陷阱

七、异常场景与调试技巧

八、实战案例:增量保存爬虫结果

九、对比其他序列化方案

十、总结


一、为什么要谈 JSON

如果把程序运行时的内存比喻成热闹的城市,那么 JSON 就是连接城市与乡村的高速公路。城市需要把新鲜果蔬送往乡村冷库(持久化),乡村也要把冷藏好的货物送回城市(加载)。JSON 凭借“纯文本、语言无关、可读性高”三大优势,成为公路网中最繁忙的一条。Python 标准库自带的高速收费站 json 模块,让我们在不安装任何第三方包的情况下,即可顺畅通行。

二、最快速上手:两把钥匙 dumps 与 loads

json 模块最常用的两把钥匙只有四个字母:

dumps 把 Python 对象变成 JSON 字符串

loads 把 JSON 字符串还原成 Python 对象

下面给出一段“零门槛”代码,让你瞬间体会二者的默契配合。

import jsonperson = {"name": "Alice", "age": 28, "skills": ["Python", "Go"]}# 序列化:Python dict -> JSON str
json_str = json.dumps(person, ensure_ascii=False, indent=2)
print("序列化结果:")
print(json_str)# 反序列化:JSON str -> Python dict
new_person = json.loads(json_str)
print("\n反序列化结果:")
print(new_person, type(new_person))

控制台会打印出整齐缩进的 JSON,再原封不动地回到字典。ensure_ascii=False 让中文不再被转义成 \uXXXX,indent=2 则满足了人类阅读的需求。短短七行,就完成了内存与文本之间的第一次握手。

三、深入 dumps:参数是魔法棒

很多人止步于 dumps(obj),却不知道它还有五个常用参数,可以让输出更优雅、体积更小。

  • separators

    默认情况下 dumps 使用 (', ', ': ') 作为分隔符,空格让 JSON 更美观,却让字节数膨胀。若要把数据塞进网络包,可以去掉空格。

compact = json.dumps(person, separators=(',', ':'))
print(compact)  # {"name":"Alice","age":28,"skills":["Python","Go"]}
  • sort_keys

    当接口文档要求字段顺序固定时,sort_keys=True 一键升序排序,避免肉眼比对差异时抓狂。

  • default

    Python 世界里不只有 dict、list、str、int、float、bool、None,还有 datetime、Decimal、自定义类。JSON 标准并不认识它们,于是 default 充当翻译官。

from datetime import datetimedef time_converter(o):if isinstance(o, datetime):return o.isoformat()raise TypeError(f"Object of type {type(o)} is not JSON serializable")event = {"created": datetime.utcnow()}
print(json.dumps(event, default=time_converter))
  • skipkeys

    当字典的 key 不是 str、int、float、bool、None 时,默认会抛出 TypeError。设置 skipkeys=True 则静默跳过这些 key,继续序列化其余内容,这在调试日志中尤为实用。

四、深入 loads:把风险挡在门外

JSON 字符串可能来自不可信来源,因此 json.loads 提供了严格的语法校验,拒绝一切非法值。除此之外,还有两个冷门但实用的参数。

  • parse_float

    默认会把带小数点的数字解析成 float,若你使用 Decimal 避免精度误差,可以指定解析器。

from decimal import Decimal
data = '{"price": 19.99}'
obj = json.loads(data, parse_float=Decimal)
print(obj["price"], type(obj["price"]))  # 19.99 <class 'decimal.Decimal'>
  • object_hook

    JSON 中的对象都是字典,若你希望直接映射成自定义类,可在反序列化阶段动手脚。

class User:def __init__(self, name, age):self.name, self.age = name, agedef __repr__(self):return f"User(name={self.name}, age={self.age})"def dict_to_user(d):if {"name", "age"} <= d.keys():return User(d["name"], d["age"])return djson_user = '{"name": "Bob", "age": 30}'
user_obj = json.loads(json_user, object_hook=dict_to_user)
print(user_obj)  # User(name=Bob, age=30)

五、文件级序列化:dump 与 load

当数据量较大或需要持久化到硬盘时,推荐用 dump 与 load 直接操作文件句柄,避免先把整个 JSON 字符串读入内存。

data = {"users": [{"id": i, "name": f"user{i}"} for i in range(3)]}# 写文件
with open("users.json", "w", encoding="utf-8") as f:json.dump(data, f, indent=2, ensure_ascii=False)# 读文件
with open("users.json", encoding="utf-8") as f:data_back = json.load(f)
print(data_back["users"][0]["name"])  # user0

注意文件必须以文本模式打开,Windows 下若出现换行符困惑,可添加 newline='' 让 Python 自动处理。

六、处理中文与编码陷阱

浏览器或 Node.js 服务常把中文转成 \u4e2d\u6587,导致日志不可读。此时只需在 dumps 中设置 ensure_ascii=False,即可保留原始 UTF-8 字符。此外,文件读写显式指定 encoding='utf-8' 可防止跨平台乱码。

七、异常场景与调试技巧

  1. TypeError: Object of type set is not JSON serializable
    集合 set 不是 JSON 基本类型,可先用 list() 转换。

  2. JSONDecodeError: Expecting property name
    字符串末尾多余逗号、单引号未转义都会导致解析失败,可使用 json.tool 命令行工具格式化校验。

  3. 性能瓶颈
    大量数据循环调用 dumps 会触发频繁内存分配,可一次性构建大字典再序列化,或改用第三方库 orjson、ujson。

八、实战案例:增量保存爬虫结果

假设我们在爬取 GitHub API,每 100 条记录保存一次中间结果,防止程序崩溃丢失进度。

import requests, json, osdef crawl_and_save(keyword, pages=5):all_items = []for page in range(1, pages + 1):url = f"https://api.github.com/search/repositories?q={keyword}&page={page}"resp = requests.get(url, timeout=10)resp.raise_for_status()items = resp.json()["items"]all_items.extend(items)# 增量保存with open(f"github_{keyword}_page{page}.json", "w", encoding="utf-8") as f:json.dump(items, f, ensure_ascii=False, indent=2)# 合并结果with open(f"github_{keyword}_all.json", "w", encoding="utf-8") as f:json.dump(all_items, f, ensure_ascii=False, indent=2)if __name__ == "__main__":crawl_and_save("python", 3)

九、对比其他序列化方案

JSON 的优势是“人读、跨语言”,劣势是“不支持复杂类型、体积较大”。如果需要更高性能或支持 Python 特有对象,可考虑:

  • pickle:速度快、支持任意对象,但仅限 Python 且存在安全风险。

  • MessagePack:二进制 JSON,体积更小,跨语言。

  • Protobuf:IDL 驱动,适合大型分布式系统。
    选择方案时,不要只追求技术酷炫,而应结合可读性、兼容性、性能三角平衡。

十、总结

序列化是把“活的” Python 对象变成“可运输”文本的过程,反序列化则是逆向复活。json 模块提供了简洁而强大的 API,让我们以极低的成本完成数据持久化、网络传输、配置管理。掌握 dumps、loads、dump、load 的细粒度参数,就能在优雅、安全、高效之间游刃有余。下次当你写接口、写爬虫、写工具脚本时,别忘了这条最熟悉也最容易被忽视的 JSON 高速通道。

http://www.dtcms.com/wzjs/836125.html

相关文章:

  • 相册模版网站图片展示小程序怎么删除
  • 网站制作是怎样做的东莞市电池网站建设
  • 公司页面网站设计模板有前景的长沙企业网站建设
  • nft制作网站wordpress post_class
  • 公司网站设计费计入什么科目衡水阿里巴巴网站建设
  • 北海建设网站自适应科技公司网站模板
  • ps工具设计网站网奇seo培训官网
  • 知名网站建设平台江苏省建设监理协会网站
  • 网站建设开发费用入什么科目西安百度快照优化
  • 娄底市建设网站开发公司资质哪里查
  • 西安网站优化排名图片网站虚拟主机
  • 南宁做网站科技公司百度竞价推广怎么做效果好
  • 石家庄小学网站建设网站开发与设计实训总结两千字
  • 网站备案服务码口令是什么意思手机好看网站模板
  • 自己建的网站无法打开软件开发有哪些
  • 后台建设电商网站微信客户端入口
  • 免费营销型网站自己做的网站怎么爬数据
  • 如何做网站品类河北网站备案流程
  • 外贸营销员seo网站推广首页排名
  • 网站服务器的作用重庆市住房和城乡建设信息网官网
  • 建设网站建设什么挣钱网站建设实训个人总结1000字
  • 红酒网站模板下载手机优化专家下载
  • 网站关键字搜索功能郑州网络推广哪家口碑好
  • 三门县住房和城乡建设规划局网站阿里云轻量级服务器搭建wordpress
  • 一个购物交易网站怎么做外贸建站是什么意思
  • 网站开发众筹可以上传高清图片的网站并做外链
  • 做胃镜多少钱那好天津津门网站a网络工程师需要考什么证书
  • 网站建设微信商城运营网站外链建设方法
  • 高端医疗器械网站源码wordpress 底部模板
  • 昆山做百度网站赣州有做网站推广的公司吗