python最重要的模块之_json

📅 2026/7/16 5:31:57
python最重要的模块之_json
一、json模块【1】基本概念与语法序列化是将数据结构或对象转换为字节流二进制数据以便存储或传输即序列化将本语言支持的高级对象转为ison格式字符串的过程(若有嵌套外面是单引号, 里面数据是双引号)对应函数: json.dumps()反序列化是将字节流还原为原始数据结构或对象的过程。即反序列化将json格式字符串转为本语言支持的数据对象格式对应函数json.loads()序列化最重要的就是json序列化。JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写同时也易于机器解析和生成并有效地提升网络传输效率。---------------------------------- | Python | JSON | | dict | object | ---------------------------------- | list, tuple | array | ---------------------------------- | str | string | ---------------------------------- | int, float | number | ---------------------------------- | True | true | ---------------------------------- | False | false | ---------------------------------- | None | null | ----------------------------------json模块是Python标准库中的一个模块用于处理JSONJavaScript Object Notation数据。它提供了一组函数来解析和生成JSON数据使得在Python中处理JSON变得非常方便。import json # 序列化 将本语言支持的高级数据对象转为json格式字符串的过程 num 3.14 name yuan l [1, 2, 3] t (4, 5, 6) d {name: yuan, age: 18, is_married: False, gf: None} print(repr(json.dumps(num))) # 3.14 print(repr(json.dumps(name))) # yuan print(repr(json.dumps(l))) # [1, 2, 3] print(repr(json.dumps(t))) # [4,5,6] print(repr(json.dumps(d))) # {name:yuan,age:18,is_married:false,gf:null} # 存储和传输 # 反序列化将json格式字符串转为本语言支持的数据对象格式 # 案例1 d {name: yuan, age: 18, is_married: False, gf: None} json_d json.dumps(d) print(json_d, type(json_d)) data json.loads(json_d) print(data, type(data)) name data.get(name) print(name) # 案例2: s {name:yuan,age:18,isMarried:False} # 重点反序列化前提数据得是json格式的字符串 data json.loads(s) print(data, type(data)) s2 [{name:yuan,age:18,isMarried:false},{name:rain,age:28,isMarried:true}] data2 json.loads(s2) print(data2,type(data2)) print(data2[1].get(name))【2】应用之持久化存储import json # 持久化存储 # (1) 序列化 # with open(data.json, modew) as f: # data {name: yuan, age: 18, is_married: False, gf: None} # 方式1 # data_json json.dumps(data) # data_json str(data) # f.write(data_json) # 方式2 # json.dump(data, f) # (2) 反序列化 with open(data.json) as f: # 方式1 # data_json f.read() # print(data_json, type(data_json)) # data_dict json.loads(data_json) # 方式2 data_dict json.load(f) print(data_dict, type(data_dict))【3】应用之网络传输 JS实现的序列化对对象处理 data {user:yuan,pwd:123} {user: yuan, pwd: 123} data {user: yuan, pwd: 123} // 序列化 undefined JSON.stringify(data) {user:yuan,pwd:123} import json s {user:yuan,pwd:123} # (1) 反序列化请求数据 data json.loads(s) print(data, type(data)) user data.get(user) pwd data.get(pwd) # 数据库筛选 user { name: 老李, email: 123qq.com, gender: male } # (2) 序列化响应数据 res json.dumps(user) print(repr(res), type(res)) res {name: \\u82d1\\u660a, email: 123qq.com, gender: male} // 反序列化 // JSON.parse(res) // {name: 老李, email: 123qq.com, gender: male} res JSON.parse(res) {name: 老李, email: 123qq.com, gender: male} res.name 老李 res.email 123qq.com 二、JSON的键对应的值全部数据类型JSON 规范一共6 种合法值类型分基础简单类型 复合容器类型2.1、简单基础类型原子值字符串 string双引号包裹文本name:张三数字 number整数、小数、负数、科学计数无整型浮点区分{age:18,price:99.9}布尔 boolean只有两个字面量true/false小写不加引号空值 null关键字null代表无数据不能写成 null2.2、复合容器类型可嵌套存放任意 6 种类型对象 object{键:值, ...}键必须是双引号字符串值可以是任意类型数组 array[值1, 值2, ...]数组元素可以是任意 JSON 类型2.3、补充关键规则不存在单独的undefined、函数、日期对象、正则这些不是合法 JSON对象的键只能是双引号字符串不能数字、单引号、标识符所有字符串必须双引号不能单引号不支持注释//、/* */。2.4、完整示例覆盖所有类型{ str: 文本, num: 123.45, bool: true, empty: null, arr: [1, a, false, null, {}, []], obj: { k1: 999 } }三、JSON 对象的键key规则3.1、键唯一允许的类型JSON 里对象的键只能是字符串类型没有其他类型。 书写要求必须用双引号 包裹单引号 非法哪怕内容是数字、中文、符号本质还是字符串键。示例json{ 123: 数字形式的字符串键, 姓名: 中文键, user-name: 带符号键 }3.2、常见误区不合法写法不加引号{ id: 1 }这是 JS 对象不是标准 JSON单引号包裹{ id: 1 }JSON 不识别数字直接当键{ 123: test }不符合 JSON 规范布尔 /null/ 数组 / 对象做键完全不允许3.3、JS 解析后的小区别前端容易混淆JS 读取 JSON 转成 JS 对象后javascript运行const obj JSON.parse({100: test}); console.log(obj[100]); // 可以用数字访问JS会自动把数字转为字符串匹配键 console.log(obj[100]); // 标准写法只是访问语法兼容原始 JSON 文件里键依然是字符串。3.4、 补充数组没有 “键”JSON 数组[]只有下标索引不存在键值对结构只有{}对象才有键。与redis做一个对比如下四、Redis 键Key1. 键的数据类型Redis 的 key底层统一是二进制字符串byte string没有其他类型。可以存任意二进制数据中文、数字、特殊符号、图片二进制都能当 key空字符串合法但不推荐建议长度控制不宜过长消耗内存、哈希计算慢也别太短可读性差。2. 键的限制与规范无特殊类型区分不像 JSON 只能双引号字符串不存在数字、列表、哈希做 key所有 key 都是字符串常用分隔规范user:100:info冒号分层设计。3. 误区plaintextSET 123 hello这里123依然是字符串 key不是数字类型 key。五、Redis 值Value五大核心数据类型常用Redis 区分存储的值类型同一数据库中 key 都是字符串值分 5 大类1. String 字符串最基础二进制安全字符串能存文本、数字、序列化 JSON、图片二进制。 命令SET / GET / INCR / APPEND示例redisSET name zhangsan SET age 202. List 列表双向链表有序、可重复左右两端插入 / 弹出。 命令LPUSH / RPUSH / LRANGE / LPOP3. Set 集合无序、元素唯一不允许重复值。 命令SADD / SMEMBERS / SISMEMBER4. Hash 哈希类似 JSON 对象一个 key 对应多个 field-value 键值对适合存储对象。 命令HSET / HGET / HGETALLredisHSET user:100 name lisi age 225. Sorted Set / ZSet 有序集合集合基础上带分数 score自动按分数排序元素唯一。 命令ZADD / ZRANGE / ZRANK六、扩展高级类型Redis 5.0Stream消息队列日志流持久化消息HyperLogLog基数统计海量数据去重计数省内存BitMap位图基于 String 实现签到、状态标记Geo地理位置坐标存储计算距离Module 扩展如 RedisJSON、RedisSearch 等自定义类型七、对比 JSON vs Redis 总结JSON对象 key只能双引号字符串value6 种类型string/number/bool/null/array/objectRedis所有 key统一二进制字符串value分为 String、List、Set、Hash、ZSet 等多种专用结构