一、JSON简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
JSON建构于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
二、引用模块
import json
三、相关函数
1.编码(encode):把一个python对象编码转换成json字符串 json.dumps()
2.解码(decode):把json格式字符串解码转换成python对象 json.loadS()
四、具体实例
实例一:json.dumps()
importjson
s= json.loads('{"name":"test","type":{"name":"seq","parameter":["1","2"]}}')printtype(s)prints.keys()print s["name"]print s["type"]print s["type"]["name"]
程序执行结果如下:
[u'type', u'name'] #此处输出结果:可以看出字典是无序的
test
{u'parameter': [u'1', u'2'], u'name': u'seq'}
seq
实例二:json.dumps() json.loads()
importjson
data= {'a':123,'b':[1,2]}
d1=json.dumps(data)printtype(data)printtype(d1)printlen(d1)printd1for i inrange(len(d1)):printd1[i]
d2=json.loads(d1)printtype(d2)printd2printd2.keys()printd2.values()for k ind2.keys():print k,d2[k]
实例三
importjson#encode
obj = [[1,2,3],123,123.123,'abc',{'key1':(1,2,3),'key2':(4,5,6)}]printtype(obj)
encodedjson=json.dumps(obj)printtype(encodedjson)printlen(encodedjson)printrepr(obj)printencodedjson#decode
decodejson =json.loads(encodedjson)printtype(decodejson)print decodejson[4]['key1']print decodejson
程序执行结果:
72[[1, 2, 3], 123, 123.123, 'abc', {'key2': (4, 5, 6), 'key1': (1, 2, 3)}]
[[1, 2, 3], 123, 123.123, "abc", {"key2": [4, 5, 6], "key1": [1, 2, 3]}][1, 2, 3]
[[1, 2, 3], 123, 123.123, u'abc', {u'key2': [4, 5, 6], u'key1': [1, 2, 3]}]
通过输出的结果可以看出,简单类型通过encode之后跟其原始的repr()输出结果非常相似,但是有些数据类型进行了改变,例如上例中的元组则转换为了列表。在json的编码过程中,会存在从python原始类型向json类型的转化过程,具体的转化对照如下:
loads方法返回了原始的对象,但是仍然发生了一些数据类型的转化。比如,上例中‘abc’转化为了unicode类型。从json到python的类型转化对照如下:
json.dumps方法提供了很多好用的参数可供选择,比较常用的有sort_keys(对dict对象进行排序,我们知道默认dict是无序存放的),separators,indent等参数。
五、排序
data1 = {'b':789,'c':456,'a':123}
data2= {'a':123,'b':789,'c':456}printtype(data1)printtype(data2)
d1= json.dumps(data1,sort_keys=True)printtype(d1)printd1#此处是for循环,将json字符串打印输出
printlen(d1)for i in range(30):printd1[i]for i inrange(len(d1)):print d1[i]
需要注意的知识点:当字典转换成json字符串之后,每一个字符都是一个单独的元素,和我们通常意义上理解的字符串就不同了,不过依然可以通过下标的方式来进行获取
完整的代码如下:
data1 = {'b':789,'c':456,'a':123}
data2= {'a':123,'b':789,'c':456}printtype(data1)printtype(data2)
d1= json.dumps(data1,sort_keys=True)printtype(d1)
d2=json.dumps(data2)printtype(d2)
d3= json.dumps(data2,sort_keys=True)printd1printd2printd3print d1 ==d2print d1 == d3
程序输出结果:
{"a": 123, "b": 789, "c": 456}
{"a": 123, "c": 456, "b": 789}
{"a": 123, "b": 789, "c": 456}
False
True
说明:
本来data1和data2数据应该是一样的,但是由于dict存储的无序特性,造成两者无法比较。因此两者可以通过排序后的结果进行存储就避免了数据比较不一致的情况发生,
但是排序后再进行存储,系统必定要多做一些事情,也一定会因此造成一定的性能消耗,所以适当排序是很重要的
六、缩进参数
importjson
data1= {'b':789,'c':456,'a':123}
d1= json.dumps(data1,sort_keys=True,indent=4)printtype(data1)printtype(d1)printd1printlen(d1)#for循环:依次将json字符串打印输出
for i inrange(len(d1)):print d1[i]
程序执行结果如下:
{"a": 123,"b": 789,"c": 456}
indent参数是缩进的意思,它可以使得数据存储的格式变得更加优雅
七、压缩
importjson
a= {'a': 123,'c': 456,'b': 789}printtype(a)printaprintlen(repr(a))
b= json.dumps(a,separators=(',',':'))printtype(b)printbprint len(repr(b))
程序执行结果:
{'a': 123, 'c': 456, 'b': 789}30
{"a":123,"c":456,"b":789}27