python3_json模块使用与字符编码问题
序列化:将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是json,xml。
反序列化:就是从存储区域(json,xml)读取反序列化对象的状态,重新创建该对象
Json:一种轻量级数据交互格式,相对于XML更简单,也易于阅读和编写,机器方便解析和生成,json是JavaScript中的一个子集
Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:
- json.dumps(): 对数据进行编码。
- json.loads(): 对数据进行解码。
在json的编解码过程中,python 的原始类型与json类型会相互转换,具体的转化对照如下:
Python 编码为 JSON 类型转换对应表:
| python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str | string |
| int, float, int- & float-derived Enums | number |
| True | true |
| False | false |
| None | null |
JSON 解码为 Python 类型转换对应表:
| JSON | Python |
|---|---|
| object | dict |
| array | list |
| string | str |
| number (int) | int |
| number (real) | float |
| true | True |
| false | False |
| null | None |
json.dumps 与 json.loads 实例
1、以下实例演示了 Python 数据结构转换为JSON:
'''
Author:Ranxf
''' import json # python 字典类型转换为JSON对象
data = {
"type": "create", # 同步用户消息类型
"username": "X012", # 用户名(唯一标识,需保存)
"password": "4875c0fa1cc0113b91a504aaff70", # MD5后用户密码(需保存)
"createTime": "2017-07-17 14:00:10.771", # 用户创建时间(需保存)
"lastLoginTime": "2017-07-17 14:00:10.771", # 最后登陆时间
"name": "test", # 姓名(需保存)
"description": "", # 描述
"policeNumber": "", # 警号(需保存)
"phoneNumber": "", # 联系方式
"organizationName": "testorganization", # 所属组织
"status": "", # 用户状态(0:正常 1:禁用 ,需保存)
"timeStamp": "2017-07-17 14:00:10.771", # 操作时间
# "roles": ["XZ_ADMIN", "XZ_BUSINESS"] # 角色代码(需保存)
"roles": ["XZ_BUSINESS"] # 角色代码(需保存)
} json_str = json.dumps(data)
print("python 原始数据: ", repr(data))
print("Json 对象: ", json_str)
运行结果:
python 原始数据: {'timeStamp': '2017-07-17\xa014:00:10.771', 'roles': ['XZ_BUSINESS'], 'policeNumber': '9257', 'name': 'test', 'type': 'create', 'password': '4875c0fa1cc0113b91a504aaff70', 'phoneNumber': '137875422489', 'lastLoginTime': '2017-07-17 14:00:10.771', 'status': '1', 'organizationName': 'testorganization', 'username': 'X012', 'description': '', 'createTime': '2017-07-17 14:00:10.771'}
Json 对象: {"timeStamp": "2017-07-17\u00a014:00:10.771", "roles": ["XZ_BUSINESS"], "policeNumber": "9257", "name": "test", "type": "create", "password": "4875c0fa1cc0113b91a504aaff70", "phoneNumber": "137875422489", "lastLoginTime": "2017-07-17 14:00:10.771", "status": "1", "organizationName": "testorganization", "username": "X012", "description": "", "createTime": "2017-07-17 14:00:10.771"}
Process finished with exit code 0
2、将一个Json编码的字符串转回一个Python数据结构:
'''
Author:Ranxf
''' import json # python 字典类型转换为JSON对象
data = {
"type": "create", # 同步用户消息类型
"username": "X012", # 用户名(唯一标识,需保存)
"password": "4875c0fa1cc0113b91a504aaff70", # MD5后用户密码(需保存)
"createTime": "2017-07-17 14:00:10.771", # 用户创建时间(需保存)
"lastLoginTime": "2017-07-17 14:00:10.771", # 最后登陆时间
"name": "测试人", # 姓名(需保存)
"description": "", # 描述
"policeNumber": "", # 警号(需保存)
"phoneNumber": "", # 联系方式
"organizationName": "测试组织", # 所属组织
"status": "", # 用户状态(0:正常 1:禁用 ,需保存)
"timeStamp": "2017-07-17 14:00:10.771", # 操作时间
# "roles": ["XZ_ADMIN", "XZ_BUSINESS"] # 角色代码(需保存)
"roles": ["XZ_BUSINESS"] # 角色代码(需保存)
} json_str = json.dumps(data)
print("python 原始数据: ", repr(data))
print("Json 对象: ", json_str) # 将json对象转换为Python字典
data2 = json.loads(json_str)
print("data2['neme']: ", data2['name'])
print("data2['organizationName']: ", data2['organizationName'])
运行结果:
/usr/bin/python3.5 /media/ranxf/13ea76aa-89fc-4228-8e84-40e5707bc91b/python3_1000/1000/python3_server/python3_json/learn_json.py
python 原始数据: {'timeStamp': '2017-07-17\xa014:00:10.771', 'policeNumber': '9257', 'createTime': '2017-07-17 14:00:10.771', 'username': 'X012', 'roles': ['XZ_BUSINESS'], 'description': '', 'password': '4875c0fa1cc0113b91a504aaff70', 'organizationName': '测试组织', 'phoneNumber': '13000000000', 'status': '1', 'type': 'create', 'lastLoginTime': '2017-07-17 14:00:10.771', 'name': '测试人'}
Json 对象: {"timeStamp": "2017-07-17\u00a014:00:10.771", "policeNumber": "9257", "createTime": "2017-07-17 14:00:10.771", "username": "X012", "roles": ["XZ_BUSINESS"], "description": "", "password": "4875c0fa1cc0113b91a504aaff70", "organizationName": "\u6d4b\u8bd5\u7ec4\u7ec7", "phoneNumber": "13000000000", "status": "1", "type": "create", "lastLoginTime": "2017-07-17 14:00:10.771", "name": "\u6d4b\u8bd5\u4eba"}
data2['neme']: 测试人
data2['organizationName']: 测试组织
注意该Python原始数据中有中文,在转换为json对象后,输出显示为Unicode编码"organizationName": "\u6d4b\u8bd5\u7ec4\u7ec7","name": "\u6d4b\u8bd5\u4eba"
解决这个问题的办法:
代码
json_str = json.dumps(data) 变为:
json_str = json.dumps(data, ensure_ascii=False)
3、如果需要处理的是文件而不是字符串,使用json.dump() 和 json.load() 来编码和解码JSON数据。例如:
'''
Author:Ranxf
''' import json
data = {
"type": "create", # 同步用户消息类型
"username": "X012", # 用户名(唯一标识,需保存)
"password": "4875c0fa1cc0113b91a504aaff70", # MD5后用户密码(需保存)
"createTime": "2017-07-17 14:00:10.771", # 用户创建时间(需保存)
"lastLoginTime": "2017-07-17 14:00:10.771", # 最后登陆时间
"name": "测试人", # 姓名(需保存)
"description": "", # 描述
"policeNumber": "", # 警号(需保存)
"phoneNumber": "", # 联系方式
"organizationName": "测试组织", # 所属组织
"status": "", # 用户状态(0:正常 1:禁用 ,需保存)
"timeStamp": "2017-07-17 14:00:10.771", # 操作时间
# "roles": ["XZ_ADMIN", "XZ_BUSINESS"] # 角色代码(需保存)
"roles": ["XZ_BUSINESS"] # 角色代码(需保存)
} with open('data1.json', 'w') as f:
json.dump(data, f, ensure_ascii=False) # 读取数据
with open('data.json', 'r') as f:
data = json.load(f) print(data)
写入如果不加(, ensure_ascii=False)数据运行结果:
{"type": "create", "organizationName": "\u6d4b\u8bd5\u7ec4\u7ec7", "password": "4875c0fa1cc0113b91a504aaff70", "description": "", "policeNumber": "9257", "phoneNumber": "13000000000", "lastLoginTime": "2017-07-17 14:00:10.771", "timeStamp": "2017-07-17\u00a014:00:10.771", "status": "1", "name": "\u6d4b\u8bd5\u4eba", "username": "X012", "createTime": "2017-07-17 14:00:10.771", "roles": ["XZ_BUSINESS"]}
加入代码中json.dump(data, f, ensure_ascii=False)下划线部分,写入data.json的数据为:
{"createTime": "2017-07-17 14:00:10.771", "policeNumber": "9257", "timeStamp": "2017-07-17 14:00:10.771", "username": "X012", "password": "4875c0fa1cc0113b91a504aaff70", "roles": ["XZ_BUSINESS"], "organizationName": "测试组织", "description": "", "phoneNumber": "13000000000", "lastLoginTime": "2017-07-17 14:00:10.771", "type": "create", "name": "测试人", "status": "1"}
以上运行结果主要看中文字段区别即可(一个是unicode显示,一个中utf8显示)
参考:
https://docs.python.org/3/library/json.html
http://www.runoob.com/python3/python3-json.html
python3_json模块使用与字符编码问题的更多相关文章
- 字符编码codecs模块(读写文件)
python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理.有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码, ...
- Python:字符编码详解
相关文章 Python中文编码问题:为何在控制台下输出中文会乱码及其原理 1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Informati ...
- Python入门笔记(14):Python的字符编码
一.字符编码中ASCII.Unicode和UTF-8的区别 点击阅读:http://www.cnblogs.com/kingstarspe/p/ASCII.html 再推荐一篇相关博文:http:// ...
- PHP iconv()函数转字符编码的问题(转)
PHP iconv()函数转字符编码的问题(转) 载自:http://www.nowamagic.net/php/php_FunctionIconv.php 在php函数库有一个函数:iconv(), ...
- Python 字符编码 zz
http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 1. 字符编码简介 1.1. ASCII ASCII(American Stan ...
- Python字符编码详解
1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...
- 【转】Python字符编码详解
转自:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 1. 字符编码简介 1.1. ASCII ASCII(American S ...
- C++运行字符编码于MSVC和GCC之间的区别
详细请参考这篇博文 http://blog.csdn.net/dbzhang800/article/details/7540905 运行字符编码就是指,当你源代码写下const char* p = & ...
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
随机推荐
- Android 蓝牙学习
Android 蓝牙学习 学习缘由 上个礼拜公司要开发个简单的五子棋游戏!其中一个需求就是支持蓝牙对战!所以苦逼的我学习蓝牙方面的知识了! 简介 Bluetooth是目前使用最广泛的无线通讯协议,近距 ...
- [SCOI2010]序列操作[分块or线段树]
#include<cstdio> #include<iostream> #define lc k<<1 #define rc k<<1|1 using ...
- android EditText自动弹出和自动关闭软键盘
程序进入某个activity直接弹出软键盘,不能直接在OnCreate中设置,必须等View绘制事件完毕才可以弹出,需要用到Timer辅助实现,如果要实现输入的功能,必须让EditText获得焦点. ...
- angular 封装公共方法
angular封装公共方法到service中间件,节省开发时间 layer.service.ts openAlert(callback) {// 传递回调函数 const dialogRef = th ...
- msvcp71.dll 怎么丢失的?如何修复
解决方法:另一台电脑上下载这个dll,再用优盘拷回来,复制到c:\windows\system32\下. 个人遇到的情况:迅雷下载东西时,或者在操作迅雷时出现的. win7 64位下 点击下载
- Sass之二(进阶篇)
源码链接:http://pan.baidu.com/s/1o8M51hC 1. 数据类型 1.1 Number 数字类型,小数类型,带有像素单位的数字类型,全部都属于Number类型 Number类型 ...
- Zabbix低级主动发现之MySQL多实例
接上篇:Zabbix自动发现与主动注册 在一个agent安装一个maraidb 拷贝一个原始配置文档并且修改配置用于开启多实例 按照配置文件初始化数据库 mysql_install_db --user ...
- Oracle之rman常用命令及维护(51CTO风哥rman课程)
list 查看数据库备份的信息 查询数据库对应物 list incarnation; list backup summary; 列出当前备份信息及汇总 B是备份 F是全备 A是归档 第三个A是是否有效 ...
- vim学习选取多行(转)
在可视化模式下,可以对一个文本块的整体进行操作.例如,首先高亮选中一部分文本,然后用d命令删除这个文本块.可视化模式的好处在于,你可以在做改动之前,就看到操作将影响的文本.可视化模式可以分为以下三种: ...
- SignalR循序渐进(一)简单的聊天程序
前阵子把玩了一下SignalR,起初以为只是个real-time的web通讯组件.研究了几天后发现,这玩意简直屌炸天,它完全就是个.net的双向异步通讯框架,用它能做很多不可思议的东西.它基于Owin ...