深入理解python对json的操作总结


Posted in Python onJanuary 05, 2017

Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式。现在也常用于http请求中,所以对json的各种学习,是自然而然的事情。Python的官网网址:https://docs.python.org/2/library/json.html?highlight=json#module-json

Json API 使用:python在版本2.6之前,是需要先下载包,安装后才能使用的,有点类似现在的RF内使用SeleniumLibrary一样。但是在2.6中,官方文档(https://docs.python.org/2.6/whatsnew/2.6.html)明显指出,“有一些重要的新的软件包添加到了标准库,比如multiprocessing 和json,但是跟python 3比,2.6的这些包不会引进更多的新功能。"于是安装python2.6以上版本的童鞋,可以不需要下载json包,直接在所需的地方就import json 即可使用,在安装目录下的Lib 下,看到这两个包(点进去仔细阅读这些源码,会有更多的收获,)如下文所示:

深入理解python对json的操作总结          

Python2.6 以上版本支持Json的编码和解码,支持python的大部分内置类型与Json进行转换。最简单的例子如下所示:

>>> import json
>>> data = {"spam" : "foo", "parrot" : 42}
>>> in_json = json.dumps(data) # Encode the data
>>> in_json
'{"parrot": 42, "spam": "foo"}'
>>> json.loads(in_json) # Decode into a Python object
{"spam" : "foo", "parrot" : 42}

Encode过程,是把python对象转换成json对象的一个过程,常用的两个函数是dumps和dump函数。两个函数的唯一区别就是dump把python对象转换成json对象生成一个fp的文件流,而dumps则是生成了一个字符串:

深入理解python对json的操作总结

深入理解python对json的操作总结

其他参数的使用都是一样的。以下是部分学习的代码片段:

dic1 = {'type':'dic1','username':'loleina','age':16}
json_dic1 = json.dumps(dic1)
print json_dic1
json_dic2 = json.dumps(dic1,sort_keys=True,indent =4,separators=(',', ': '),encoding="gbk",ensure_ascii=True )
print json_dic2

运行结果如下所示:

深入理解python对json的操作总结

如果把实例中的key'username'的value换成中文的“测试”,则用第一次不加参数转换则会报错,但是用第二个加参数的就能正常运行。

深入理解python对json的操作总结

实际上就是对函数的参数的一个理解过程,下面列出几个常用的参数:

Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key

ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示

indent:应该是一个非负的整型,如果是0,或者为空,则一行显示数据,否则会换行且按照indent的数量显示前面的空白,这样打印出来的json数据也叫pretty-printed json

separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(',',':');这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。

encoding:默认是UTF-8,设置json数据的编码方式。

sort_keys:将数据根据keys的值进行排序。

 Decode过程,是把json对象转换成python对象的一个过程,常用的两个函数是loads和load函数。区别跟dump和dumps是一样的。

if __name__ == '__main__':
  # 将python对象test转换json对象
  test = [{"username":"测试","age":16},(2,3),1]
  print type(test)
  python_to_json = json.dumps(test,ensure_ascii=False)
  print python_to_json
  print type(python_to_json)

  # 将json对象转换成python对象
  json_to_python = json.loads(python_to_json)
  print json_to_python
  print type(json_to_python)

运行结果如下:

深入理解python对json的操作总结

从上面2个例子的测试结果可以看到,python的一些基本类型通过encode之后,tuple类型就转成了list类型了,再将其转回为python对象时,list类型也并没有转回成tuple类型,而且编码格式也发生了变化,变成了Unicode编码。具体转化时,类型变化规则如下所示:

Python-->Json

深入理解python对json的操作总结

Json-->Python

深入理解python对json的操作总结

Json处理中文问题:

关于python字符串的处理问题,如果深入的研究下去,我觉得可以写2篇文章了(实际上自己还没整很明白),在这里主要还是总结下使用python2.7.11处理json数据的问题。前期做接口测试,处理最多的事情就是,把数据组装成各种协议的报文,然后发送出去。然后对返回的报文进行解析,后面就遇到将数据封装在json内嵌入在http的body内发送到web服务器,然后服务器处理完后,返回json数据结果的问题。在这里面就需要考虑json里有中文数据,怎么进行组装和怎么进行解析,以下是基础学习的一点总结:

第一:Python 2.7.11的默认编码格式是ascii编码,而python3的已经是unicode,在学习编解码的时,有出现乱码的问题,也有出现list或者dictionary或者tuple类型内的中文显示为unicode的问题。出现乱码的时候,应该先看下当前字符编码格式是什么,再看下当前文件编码格式是什么,或者没有设置文件格式时,查看下IDE的默认编码格式是什么。最推崇的方式当然是每次编码,都对文件编码格式进行指定,如在文件前 设置# coding= utf-8。

第二:字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

第三:将json数据转换成python数据后,一般会得到一个dict类型的变量,此时内部的数据都是unicode编码,所以中文的显示看着很痛苦,但是对于dict得到每个key的value后,中文就能正常显示了,如下所示:

# coding= utf-8
import json
import sys

if __name__ == '__main__':
  # 将python对象test转换json对象
  test = {"username":"测试","age":16}
  print type(test)
  python_to_json = json.dumps(test,ensure_ascii=False)
  print python_to_json
  print type(python_to_json)

  # 将json对象转换成python对象
  json_to_python = json.loads(python_to_json)
  print type(json_to_python)
  print json_to_python['username']

运行结果:

深入理解python对json的操作总结

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现从网络下载文件并获得文件大小及类型的方法
Apr 28 Python
python正则表达式的使用
Jun 12 Python
python远程连接服务器MySQL数据库
Jul 02 Python
python使用多进程的实例详解
Sep 19 Python
Python下opencv图像阈值处理的使用笔记
Aug 04 Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 Python
Python实现手机号自动判断男女性别(实例解析)
Dec 22 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
Jun 08 Python
python 利用opencv实现图像网络传输
Nov 12 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 Python
pycharm 如何查看某一函数源码的快捷键
May 12 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 #Python
Python网络爬虫出现乱码问题的解决方法
Jan 05 #Python
python fabric实现远程部署
Jan 05 #Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 #Python
python 捕获shell脚本的输出结果实例
Jan 04 #Python
完美解决Python2操作中文名文件乱码的问题
Jan 04 #Python
python去除空格和换行符的实现方法(推荐)
Jan 04 #Python
You might like
打造计数器DIY三步曲(中)
2006/10/09 PHP
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
ThinkPHP添加更新标签的方法
2014/12/05 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
《童趣》教学反思
2014/02/19 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫