Json 最广泛的应用是作为 AJAX 中 web 服务器和客户端的通讯的数据格式,本篇文章主要介绍了 python 对 json 的操作总结,具有一定的参考价值,有兴趣的可以了解一下。
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
Json 简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。Json 最广泛的应用是作为 AJAX 中 web 服务器和客户端的通讯的数据格式。现在也常用于 http 请求中,所以对 json 的各种学习,是自然而然的事情。Python 的官网网址:{aa1aa}
Json API 使用:python 在版本 2.6 之前,是需要先下载包,安装后才能使用的,有点类似现在的 RF 内使用 SeleniumLibrary 一样。但是在 2.6 中,官方文档({aa0aa})明显指出,"有一些重要的新的软件包添加到了标准库,比如 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']
运行结果:
来源: http://www.phperz.com/article/17/0314/319050.html