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

发布时间 - 2026-01-10 22:19:51    点击率:

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 下,看到这两个包(点进去仔细阅读这些源码,会有更多的收获,)如下文所示:

          

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则是生成了一个字符串:

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

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

运行结果如下所示:

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

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

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)

运行结果如下:

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

Python-->Json

Json-->Python

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操作json数据  # python字典和json.dumps()的遇到的坑分析  # Python操作redis实例小结【String、Hash、List、Set等】  # 浅谈Python中的异常和JSON读写数据的实现  # Python是怎样处理json模块的  # 浅谈python处理json和redis hash的坑  # 转换成  # 所示  # 就能  # 则会  # 会报  # 正常显示  # 设置成  # 默认值  # 都是  # 是一个  # 看着  # 几个  # 出现乱码  # 在这里  # 也有  # 是一种  # 会有  # 还没  # 我觉得  # 最多 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Linux后台任务运行方法_nohup与&使用技巧【技巧】  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  如何快速完成中国万网建站详细流程?  JavaScript如何操作视频_媒体API怎么控制播放  如何在IIS中新建站点并配置端口与IP地址?  音乐网站服务器如何优化API响应速度?  如何快速辨别茅台真假?关键步骤解析  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Laravel安装步骤详细教程_Laravel环境搭建指南  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  高防服务器租用如何选择配置与防御等级?  如何快速生成专业多端适配建站电话?  用yum安装MySQLdb模块的步骤方法  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  详解Android中Activity的四大启动模式实验简述  如何在腾讯云服务器上快速搭建个人网站?  javascript中的try catch异常捕获机制用法分析  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何快速搭建高效简练网站?  如何在服务器上三步完成建站并提升流量?  如何用免费手机建站系统零基础打造专业网站?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  WEB开发之注册页面验证码倒计时代码的实现  Laravel如何集成Inertia.js与Vue/React?(安装配置)  如何在Ubuntu系统下快速搭建WordPress个人网站?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  焦点电影公司作品,电影焦点结局是什么?  Laravel怎么实现验证码(Captcha)功能  Android 常见的图片加载框架详细介绍  如何在IIS中新建站点并配置端口与物理路径?  如何在 Pandas 中基于一列条件计算另一列的分组均值  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Python面向对象测试方法_mock解析【教程】  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Laravel Docker环境搭建教程_Laravel Sail使用指南  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何快速生成可下载的建站源码工具?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何快速上传自定义模板至建站之星?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  php json中文编码为null的解决办法  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】