Python-json模块

一、相关概念

序列号 和反序列号

序列号:把内存中的数据类型转成一种特定格式,这种格式(json/pickle)可以用于存储,或者传输给其他平台

import json

内存中是数据类型 ----> 序列化 ----> 特定格式(json/pickle)

内存中是数据类型 <---- 反序列化 <---- 特定格式(json/pickle)

用途:

1) 保存程序运行状态(存档)

2)跨平台数据交互(只能交互共有的数据类型),例:Java --- Python,只能用json,pickle是Python专用格式

二、json模块

json 是一种通用格式,只能序列化所有编程语言都支持的数据类型;

1、序列化

(1)第一种方式

复制代码
dic = {'name': '李元芳', 'age': 27, 'salary': 30, 'married': False, 'hobbies': '大人此事必有蹊跷'}
json_res = json.dumps(dic)
json_res1 = json.dumps(dic,ensure_ascii=False) # 确保所有字符能够用ASCII码表示
with open('data/test.json',mode='wt',encoding='utf-8') as f:
    f.write(json_res)

print(json_res, type(json_res))
print(json_res1, type(json_res1))

运行结果:

{"name": "\u674e\u5143\u82b3", "age": 27, "salary": 30, "married": false, "hobbies": "\u5927\u4eba\u6b64\u4e8b\u5fc5\u6709\u8e4a\u8df7"} <class 'str'>

{"name": "李元芳", "age": 27, "salary": 30, "married": false, "hobbies": "大人此事必有蹊跷"} <class 'str'>

{"name": "\u674e\u5143\u82b3";双引号是所有编程语言通用的语法,汉字编程unicode格式二进制,这个可以控制

(2)第二种方式

复制代码
dic = {'name': '李元芳', 'age': 27, 'salary': 30, 'married': False, 'hobbies': '大人此事必有蹊跷'}
with open('data/test.json', mode='wt', encoding='utf-8') as f:
    json.dump(dic, f,ensure_ascii= False)  # 将序列化对象传给 f

2、 反序列化

(1)第一种方式

复制代码
dic = json.loads('{"name": "李元芳", "age": 27, "salary": 30, "married": false, "hobbies": "大人此事必有蹊跷"}')
print(dic, type(dic))
复制代码
# 从json文件中取值
with open('data/test.json',mode='rt',encoding='utf-8') as f:
    json_res = f.read()
dic = json.loads(json_res)
print(dic, type(dic))

运行结果:

{'name': '李元芳', 'age': 27, 'salary': 30, 'married': False, 'hobbies': '大人此事必有蹊跷'} <class 'dict'>

(2)第二种方式

复制代码
with open('data/test.json',mode='rt',encoding='utf-8') as f:
    json_res = json.load(f)
print(json_res)

注:

复制代码
json.dumps({1,2,3})

TypeError: Object of type set is not JSON serializable


三、pickle模块

复制代码
dic = {
    'name': '李元芳',
    'age': 27,
    'salary': 30,
    'married': False,
    'hobbies': ['大人此事必有蹊跷', '如燕', '果然不出大人所料'],
    's': {1, 2, 3, 4, 5, 7}
}
复制代码
pickle_res = pickle.dumps(dic)
print(pickle_res,type(pickle_res))

运行结果:

b'\x80\x04\x95\x97\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\t\xe6\x9d\x8e\xe5\x85\x83\xe8\x8a\xb3\x94\x8c\x03age\x94K\x1b\x8c\x06salary\x94K\x1e\x8c\x07married\x94\x89\x8c\x07hobbies\x94]\x94(\x8c\x18\xe5\xa4\xa7\xe4\xba\xba\xe6\xad\xa4\xe4\xba\x8b\xe5\xbf\x85\xe6\x9c\x89\xe8\xb9\x8a\xe8\xb7\xb7\x94\x8c\x06\xe5\xa6\x82\xe7\x87\x95\x94\x8c\x18\xe6\x9e\x9c\xe7\x84\xb6\xe4\xb8\x8d\xe5\x87\xba\xe5\xa4\xa7\xe4\xba\xba\xe6\x89\x80\xe6\x96\x99\x94e\x8c\x01s\x94\x8f\x94(K\x01K\x02K\x03K\x04K\x05K\x07\x90u.' <class 'bytes'>

复制代码
pickle_res = pickle.dumps(dic,protocol=0)  # 防止乱码

with open('data/test.picle',mode='wb') as f:
    f.write(pickle_res)

运行结果:

复制代码
with open('data/test1.picle',mode='wb') as f:
    pickle.dump(dic,f,protocol=0)
相关推荐
1uther5 分钟前
Unity核心概念⑨:Screen
开发语言·游戏·unity·c#·游戏引擎
C_Liu_29 分钟前
C++:类和对象(下)
开发语言·c++
coderxiaohan33 分钟前
【C++】类和对象1
java·开发语言·c++
诗句藏于尽头1 小时前
Django模型与数据库表映射的两种方式
数据库·python·django
阿幸软件杂货间1 小时前
Office转PDF转换器v1.0.py
开发语言·pdf·c#
智数研析社1 小时前
9120 部 TMDb 高分电影数据集 | 7 列全维度指标 (评分 / 热度 / 剧情)+API 权威源 | 电影趋势分析 / 推荐系统 / NLP 建模用
大数据·人工智能·python·深度学习·数据分析·数据集·数据清洗
扯淡的闲人1 小时前
多语言编码Agent解决方案(5)-IntelliJ插件实现
开发语言·python
丑小鸭是白天鹅1 小时前
Kotlin协程详细笔记之切线程和挂起函数
开发语言·笔记·kotlin
moxiaoran57531 小时前
Flask学习笔记(一)
后端·python·flask
sali-tec2 小时前
C# 基于halcon的视觉工作流-章34-环状测量
开发语言·图像处理·算法·计算机视觉·c#