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(data)
将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。
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的数据结构