现在以json为数据传输格式的RESTful接口非常流行。为调试这样的接口,一个常用的办法是使用curl命令: curl http://somehost.com/some-restful-api 对于返回的json字符串,一般在服务端不加处理的情况下,都是没有任何’\t’和’\n’的。为了方便查看,在bash上可以简单地对它进行格式化: curl http://somehost.com/some-restful-api | python…
Python操作json, Python读写json, Python 读写JSON数据, Python对json的操作及实例解析
json介绍
说明:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition – December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
关于json更为详细的内容,可以参考其官方网站:http://www.json.org
从官方网站上摘取部分,了解一下json的结构:
JSON建构于两种结构:
- 名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
- python标准库中有json模块,主要是执行序列化和反序列化功能:
序列化:encoding,把一个python对象编码转化成json字符串,json.dumps()
反序列化:decoding,把json格式字符串解码转换为python数据对象,json.loads()
一般json
查看json使用方法
>>> import json >>> json.__all__ ['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']
encoding: dumps()
>>> data = [{"name":"qiwsir", "lang":("python", "english"), "age":40}] >>> print data [{'lang': ('python', 'english'), 'age': 40, 'name': 'qiwsir'}] >>> data_json = json.dumps(data) >>> print data_json [{"lang": ["python", "english"], "age": 40, "name": "qiwsir"}]
encoding的操作是比较简单的,请注意观察data和data_json的不同——lang的value从元组变成了列表,还有不同:
>>> type(data_json) <type 'str'> >>> type(data) <type 'list'>
将python对象转化为json类型,是按照下表所示对照关系转化的:
python | json |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
decoding: loads()
decoding的过程也像上面一样简单:
>>> new_data = json.loads(data_json) >>> new_data [{u'lang': [u'python', u'english'], u'age': 40, u'name': u'qiwsir'}]
需要注意的是,解码之后,并没有将元组还原。
解码的数据类型对应关系:
json | python |
---|---|
object | dict |
array | list, tuple |
string | str, unicode |
number(int) | int, long |
number(read) | float |
true | True |
false | False |
null | None |
上面的data都不是很长,还能凑合阅读,如果很长了,阅读就有难度了。所以,json的dumps()提供了可选参数,利用它们能在输出上对人更友好(这对机器是无所谓的)。
>>> data={'a':'aaa', 'b':'bbb', 'c':[{'c1':'cc1', 'c2':'cc2'}]} >>> data_j = json.dumps(data, sort_keys=True, indent=2) >>> print data_j { "a": "aaa", "b": "bbb", "c": [ { "c1": "cc1", "c2": "cc2" } ] }
sort_keys=True
意思是按照键的字典顺序排序,indent=2
是让每个键值对显示的时候,以缩进两个字符对齐。这样的视觉效果好多了。
对于字典,json会假设key是字符串(字典中的任何非字符串key都会在编码时转换为字符串),要符合JSON规范,应该只对python列表和字典进行编码。此外,在WEB应用中,把最顶层对象定义为字典是一种标准做法。
大json字符串
如果数据不是很大,上面的操作足够了。但是,上面操作是将数据都读入内存,如果太大就不行了。把数据放入文件,你可以使用 json.dump() 和 json.load() 来编码和解码JSON。
JSON 函数
使用 JSON 函数需要导入 json 库:import json。
函数 | 描述 |
---|---|
json.dumps | 将 Python 对象编码成 JSON 字符串 |
json.loads | 将已编码的 JSON 字符串解码为 Python 对象 |
dump功能
# 将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件 >>> with open('tmp.json', 'w') as f: ... json.dump(data_j, f) ... > cat tmp.json {"a": "aaa", "c": [{"c2": "cc2", "c1": "cc1"}], "b": "bbb"}
load功能
>>> with open('tmp.json', 'r') as f: ... data = json.load(f) ... >>> print data {u'a': u'aaa', u'c': [{u'c2': u'cc2', u'c1': u'cc1'}], u'b': u'bbb'}
- 从数据文件中读取数据,并将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']
运行结果:
使用第三方库:Demjson
Demjson 是 python 的第三方模块库,可用于编码和解码 JSON 数据,包含了 JSONLint 的格式化及校验功能。
Github 地址:https://github.com/dmeranda/demjson
环境配置
在使用 Demjson 编码或解码 JSON 数据前,我们需要先安装 Demjson 模块。本教程我们会下载 Demjson 并安装:
$ tar -xvzf demjson-2.2.3.tar.gz $ cd demjson-2.2.3 $ python setup.py install
本文: Python操作json, Python读写json, Python 读写JSON数据, Python对json的操作及实例解析