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建构于两种结构:

“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

二、引用模块

ContractedBlock.gif

ExpandedBlockStart.gif

import json

View Code

三、相关函数

1.编码(encode):把一个python对象编码转换成json字符串 json.dumps()

2.解码(decode):把json格式字符串解码转换成python对象 json.loadS()

四、具体实例

实例一:json.dumps()

ContractedBlock.gif

ExpandedBlockStart.gif

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"]

View Code

程序执行结果如下:

ContractedBlock.gif

ExpandedBlockStart.gif

[u'type', u'name'] #此处输出结果:可以看出字典是无序的

test

{u'parameter': [u'1', u'2'], u'name': u'seq'}

seq

View Code

实例二:json.dumps() json.loads()

ContractedBlock.gif

ExpandedBlockStart.gif

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]

View Code

实例三

ContractedBlock.gif

ExpandedBlockStart.gif

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

View Code

程序执行结果:

ContractedBlock.gif

ExpandedBlockStart.gif

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]}]

View Code

通过输出的结果可以看出,简单类型通过encode之后跟其原始的repr()输出结果非常相似,但是有些数据类型进行了改变,例如上例中的元组则转换为了列表。在json的编码过程中,会存在从python原始类型向json类型的转化过程,具体的转化对照如下:

201112141621131652.png

loads方法返回了原始的对象,但是仍然发生了一些数据类型的转化。比如,上例中‘abc’转化为了unicode类型。从json到python的类型转化对照如下:

201112141621146178.png

json.dumps方法提供了很多好用的参数可供选择,比较常用的有sort_keys(对dict对象进行排序,我们知道默认dict是无序存放的),separators,indent等参数。

五、排序

ContractedBlock.gif

ExpandedBlockStart.gif

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]

View Code

需要注意的知识点:当字典转换成json字符串之后,每一个字符都是一个单独的元素,和我们通常意义上理解的字符串就不同了,不过依然可以通过下标的方式来进行获取

完整的代码如下:

ContractedBlock.gif

ExpandedBlockStart.gif

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

View Code

程序输出结果:

ContractedBlock.gif

ExpandedBlockStart.gif

{"a": 123, "b": 789, "c": 456}

{"a": 123, "c": 456, "b": 789}

{"a": 123, "b": 789, "c": 456}

False

True

View Code

说明:

本来data1和data2数据应该是一样的,但是由于dict存储的无序特性,造成两者无法比较。因此两者可以通过排序后的结果进行存储就避免了数据比较不一致的情况发生,

但是排序后再进行存储,系统必定要多做一些事情,也一定会因此造成一定的性能消耗,所以适当排序是很重要的

六、缩进参数

ContractedBlock.gif

ExpandedBlockStart.gif

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]

View Code

程序执行结果如下:

ContractedBlock.gif

ExpandedBlockStart.gif

{"a": 123,"b": 789,"c": 456}

View Code

indent参数是缩进的意思,它可以使得数据存储的格式变得更加优雅

七、压缩

ContractedBlock.gif

ExpandedBlockStart.gif

importjson

a= {'a': 123,'c': 456,'b': 789}printtype(a)printaprintlen(repr(a))

b= json.dumps(a,separators=(',',':'))printtype(b)printbprint len(repr(b))

View Code

程序执行结果:

ContractedBlock.gif

ExpandedBlockStart.gif

{'a': 123, 'c': 456, 'b': 789}30

{"a":123,"c":456,"b":789}27

View Code

八、参考文章

http://www.cnblogs.com/kaituorensheng/p/3877382.html

http://www.cnblogs.com/coser/archive/2011/12/14/2287739.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值