JSON数据格式与json模块

JSON数据格式与json模块

2026年9月18日·#编程学习/python学习笔记Python/JSON·1323 字 7 分钟
浏览量加载中...
AI 摘要

JSON 的语法规则、Python 字典与 JSON 的对应关系,以及 json 模块的 dump/load 序列化与反序列化

JSON 是什么#

JSON(JavaScript Object Notation)是前端的一种对象表示方法,也是软件开发中最常用的数据交换格式。它的表示形式类似于 Python 中的字典,都是 key: value 这种形式,不过:

Important

JSON 中所有的 key 都必须使用双引号引起来,这一点和 Python 字典不同(Python 里 'name'"name" 都可以)。

{
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
],
"stream": false
}

JSON 支持的数据类型#

类型写法示例
数字整数和小数都是数字123.14
字符串"" 引起来"jack"
布尔两种值:truefalsetrue
对象{} 表示,{} 之间是键值对形式,键是字符串,值可以是任意其它类型{"name": "涛哥"}
列表[] 表示,[] 中是列表的元素,多个元素以 , 分割["reading", "swimming"]

JSON 与 Python 的对应关系#

JSONPython
对象 {}字典 dict
列表 []列表 list
字符串 "abc"字符串 str
数字 12 / 3.14整数 int / 浮点数 float
true / falseTrue / False
nullNone

Python 处理 JSON:json 模块#

为了简化 JSON 数据的处理,Python 标准库中提供了处理 JSON 数据的核心模块 json,不需要额外安装。

方法作用方向
json.dump(obj, f)将 Python 对象序列化为 json 格式字符串并写入文件Python → 文件
json.load(f)从文件中读取 json 格式数据,并将其反序列化为 Python 对象文件 → Python

写入 json 数据(序列化)#

import json
user = {
"name": "涛哥",
"age": 18,
"gender": "男",
"hobbies": ["reading", "swimming"]
}
with open("resources/user.json", "w", encoding="utf-8") as f:
# ensure_ascii: 默认为True, 确保所有输出的数据都是ascii编码(非ASCII码会进行转义);
# False, 非ASCII码保留原样输出
# indent: 会在输出的json数据中添加缩进(格式化)
json.dump(user, f, ensure_ascii=False, indent=2)

写出来的文件(user.json):

{
"name": "涛哥",
"age": 18,
"gender": "男",
"hobbies": [
"reading",
"swimming"
]
}
Warning

ensure_ascii 默认是 True,此时中文会被转义成 \u6d9b\u54e5 这种形式,文件里看不到中文(不影响程序读取,但人没法检查内容)。所以写中文必须加 ensure_ascii=False

读取 json 数据(反序列化)#

import json
with open("resources/user.json", "r", encoding="utf-8") as f:
user = json.load(f)
print(user) # {'name': '涛哥', 'age': 18, 'gender': '男', 'hobbies': ['reading', 'swimming']}
print(type(user)) # <class 'dict'>

读进来直接就是 Python 的字典,可以继续用 ["key"] 取值。

补充:四个方法的区别#

json 模块里除了操作文件的两个方法,还有直接操作字符串的两个方法:

方法输入输出
json.dump(obj, f)Python 对象 + 文件对象写入文件
json.dumps(obj)Python 对象JSON 格式的字符串
json.load(f)文件对象Python 对象
json.loads(s)JSON 格式的字符串Python 对象
Tip

记忆技巧:带 s 的是操作字符串(string)

Note

JSON 语法比 Python 严格:不支持单引号、不支持注释、最后一个元素后面不能有多余的逗号。手写请求体时最容易在这三处出错。

相关#

练习题#

一、回忆填空(写完再展开对答案)#

  1. JSON 里所有的 key 都必须用 ____ 引起来
  2. 把 Python 对象写进文件:json.____(obj, f)
  3. 从文件读取并变成 Python 对象:json.____(f)
  4. 另外两个操作字符串(不落文件)的方法:json.____()json.____()
  5. 写中文时必须加 ensure_ascii=____,否则中文会变成 ____ 形式
  6. indent=2 的作用是给输出的 JSON 加 ____
  7. 对应关系:JSON 对象 ↔ Python ____;JSON 列表 ↔ Python ____;true/false ↔ ____;null ↔ ____
  8. JSON 语法比 Python 严格:不支持 ____ 引号、不支持 ____、最后不能有多余的逗号
填空答案(做完再点开)
  1. 双引号("") 2. dump 3. load 4. dumpsloads(带 s 的操作字符串) 5. False\uXXXX 转义 6. 缩进(格式化) 7. 字典 dict、列表 list、True/FalseNone 8. 单引号、注释

二、裸写题#

  • 2-1 把字典写进 JSON 文件 把一个包含姓名、年龄、性别、爱好的字典写进 user.json,要求文件里能看到中文、并且有缩进方便阅读。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:写文件要先能打开文件,再用 json 模块提供的方法把对象”倒”进去;中文别被转义,格式要好看 二级 · 方法with open(...) + json.dump(obj, f, ensure_ascii=..., indent=...) 三级 · 骨架with open("user.json", "w", encoding="utf-8") as f:\n json.____(user, f, ensure_ascii=____, indent=____)

    参考答案(做完再点开)
    import json
    user = {
    "name": "涛哥",
    "age": 18,
    "gender": "男",
    "hobbies": ["reading", "swimming"]
    }
    with open("user.json", "w", encoding="utf-8") as f:
    json.dump(user, f, ensure_ascii=False, indent=2)
  • 2-2 读回 JSON 文件 读取上一步写出的 user.json,打印内容并打印它的类型。

    提示

    一级 · 思路:读文件 + 把 JSON 文本变回 Python 对象 二级 · 方法json.load(f)type() 三级 · 骨架with open("user.json", "r", encoding="utf-8") as f:\n user = json.____(f)

    参考答案(做完再点开)
    import json
    with open("user.json", "r", encoding="utf-8") as f:
    user = json.load(f)
    print(user)
    print(type(user)) # <class 'dict'>
  • 2-3 不落文件的字符串互转 把一个字典转成 JSON 字符串打印出来,再把这个字符串转回字典并取出其中一个值。

    提示

    一级 · 思路:想想哪两个方法名带 s(string) 二级 · 方法json.dumps() / json.loads() 三级 · 骨架s = json.____(obj)obj2 = json.____(s)

    参考答案(做完再点开)
    import json
    obj = {"name": "张三", "age": 18, "hobbies": ["reading", "swimming"]}
    s = json.dumps(obj, ensure_ascii=False)
    print(s) # {"name": "张三", ...} —— 字符串
    obj2 = json.loads(s)
    print(obj2["name"]) # 张三

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# Ajax2# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc3# CSS6# DeepSeek6# deepseek2# DELETE1# Docker1# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML6# HTTP5# ImageManager1# Java23# java13# JavaScript5# JDBC3# JSON2# JUnit1# LangChain25# Logback1# Maven6# Muse Spark1# Mybatis1# MyBatis4# MySQL28# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python65# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot11# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue7# Waline3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端32# 动态1# 动漫1# 包1# 单词2# 博客7# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 对象1# 导航栏1# 工具2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程1# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常92# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试1# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]