详解python使用simplejson模块解析json的方法

1,json模块介绍
json(javascript object notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于javascript programming language, standard ecma-262 3rd edition – december 1999的一个子集。json采用完全独立于语言的文本格式,但是也使用了类似于c语言家族的习惯(包括c, c++, c#, java, javascript, perl, python等)。这些特性使json成为理想的数据交换语言。

2,json的格式
2.1,对象:

{name:”peggy”,email:”peggy@gmail.com”,homepage:”http://www.jb51.net”}
{ 属性 : 值 , 属性 : 值 , 属性 : 值 }

2.2,数组:
是有顺序的值的集合。一个数组开始于”[“,结束于”]”,值之间用”,”分隔。

[
{name:”peggy”,email:”peggy@gmail.com”,homepage:”http://www.jb51.net”}, {name:”peggy”,email:”peggy@gmail.com”,homepage:”http://www.jb51.net”},
{name:”peggy”,email:”peggy@gmail.com”,homepage:”http://www.jb51.net”}
]

另,值可以是字符串、数字、true、false、null,也可以是对象或数组。这些结构都能嵌套。

3,json的导入导出
这里的write/dump的含义是将json对象输入到一个python_object中,如果python_object是文件,则dump到文件中;如果是对象,则dump到内存中。这是序列化。

3.1,读取json文件

import simplejson as json
f = file(‘table.json’)
source = f.read()
target = json.jsondecoder().decode(source)
print target
import simplejson as json
jsonobject = json.load(file(‘table.json’))
print jsonobject

3.2,显示json文件
为了显示json格式好看,原来的json文件:

[admin@r42h06016.xy2.aliyun.com]$python readjson.py
[{‘query’: ‘desc zt1;’, ‘message’: ‘{“descibetablewithpartspec”: “false”, “gettablemetastring”:”{\\”tablename\\”:\\”zt1\\”,\\”owner\\”:\\”1365937150772213\\”,\\”createtime\\”:1346218114,\\”lastmodifiedtime\\”:0,\\”columns\\”:[{\\”name\\”:\\”a\\”,\\”type\\”:\\”string\\”},{\\”name\\”:\\”b\\”,\\”type\\”:\\”string\\”}],\\”partitionkeys\\”:[{\\”name\\”:\\”pt\\”,\\”type\\”:\\”string\\”}]}”}’, ‘queryid’: ”, ‘result’: ‘ok’}]

执行文件:

import simplejson as json
jsonobject = json.load(file(‘table.json’))
print json.dumps(jsonobject,sort_keys=true,indent=4)

显示:

[admin@r42h06016.xy2.aliyun.com]$python readjson.py
[
{
“message”: “{\”descibetablewithpartspec\”: \”false\”, \”gettablemetastring\”:\”{\\\”tablename\\\”:\\\”zt1\\\”,\\\”owner\\\”:\\\”1365937150772213\\\”,\\\”createtime\\\”:1346218114,\\\”lastmodifiedtime\\\”:0,\\\”columns\\\”:[{\\\”name\\\”:\\\”a\\\”,\\\”type\\\”:\\\”string\\\”},{\\\”name\\\”:\\\”b\\\”,\\\”type\\\”:\\\”string\\\”}],\\\”partitionkeys\\\”:[{\\\”name\\\”:\\\”pt\\\”,\\\”type\\\”:\\\”string\\\”}]}\”}”,
“query”: “desc zt1;”,
“queryid”: “”,
“result”: “ok”
}
]

3.3,json模块示例:

import json
# converting python to json
json_object = json.write( python_object )
# converting json to python
python_object = json.read( json_object )

3.4,simplejson模块 示例:

import simplejson
# converting python to json
json_object = simplejson.dumps( python_object )
# converting json to python
python_object = simplejson.loads( json_object )

其中的json_object也可以是文件名比如file(“tmp/table.json”)

4,json数据的解析
假设对于data.json文件如下:

代码如下:

{‘issuccess’: true, ‘errormsg’: ”, ‘total’: 1, ‘data’: [{‘isonline’: true, ‘idc’: ‘\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf’, ‘assetsnum’: ‘b50070100007003’, ‘responsibilityperson’: ‘\xe5\xbc\xa0\xe4\xb9\x8b\xe8\xaf\x9a’, ‘devicemodel’: ‘poweredge 1950’, ‘servicetag’: ‘729hh2x’, ‘ip’: ‘172.16.20.163’, ‘hostname’: ‘hzshterm1.alibaba.com’, ‘manageip’: ‘172.31.58.223’, ‘cabinet’: ‘h05’, ‘buytime’: ‘2009-06-29’, ‘usestate’: ‘\xe4\xbd\xbf\xe7\x94\xa8\xe4\xb8\xad’, ‘memoryinfo’: {‘amount’: 4, ‘size’: 8192}, ‘cpuinfo’: {‘corenum’: 8, ‘l2cachesize’: 6144, ‘amount’: 2, ‘model’: ‘intel(r) xeon(r) cpu e5405 @ 2.00ghz’, ‘masterfrequency’: 1995}, ‘cabinetpositionnum’: ”, ‘outguaranteetime’: ”, ‘logicsite’: ‘\xe4\xb8\xad\xe6\x96\x87\xe7\xab\x99’}]}

首先导入该文件,建立json对象,并查看类型,已经是dict类型了。

#test.py
import simplejson as json
ddata = json.loads(file(“data.json”))
print ddata
print type(ddata)#

其次,我们以读字典中key 为”data”对应的键值

>>> ddata[‘data’] //查看字典的方法!
>>>type(ddata[‘data’])

发现ddata[‘data’]是一个列表,列表就要用序号来查询

>>> ddata[‘data’][0] //查看列表的方法!
>>> type(ddata[‘data’][0])

ddata[‘data’]列表的0号元素是个字典。。
好,那我们查查key为idc的键值是多少

>>> ddata[‘data’][0][‘idc’] //查看字典的方法!
>>> ddata[‘data’][0][‘idc’] //查看字典的方法!
‘\xe6\x9d\xad\xe5\xb7\x9e\xe5\xbe\xb7\xe8\x83\x9c\xe6\x9c\xba\xe6\x88\xbf’
>>> print ddata[‘data’][0][‘idc’]
杭州德胜机房

5.一些性能讨论

简单测试了一下,如果用json,也就是python2.6以上自带的json处理库,效率还算可以:
1k的数据,2.9ghz的cpu,单核下每秒能dump:36898次。大约是pyamf的5倍。但数据量较大,约为pyamf的1.67倍(1101/656)。

start_time: 1370747463.77
loop_num: 36898
end_time: 1370747464.78

再看看simplejson,没有安装c扩展的情况下:

2016324173247058.jpg (592×62)

simplejson,没有安装c扩展,跑出的结果让我惊讶:

start_time: 1370748132.87
loop_num: 1361
end_time: 1370748133.88

效率如此之低下。

下面是测试代码:

#! /usr/bin/env python
#coding=utf-8
import time
import json
test_data = {
‘baihe’: {
‘name’: unicode(‘百合’, ‘utf-8’),
‘say’: unicode(‘清新,淡雅,花香’, ‘utf-8’),
‘grow_time’: 0.5,
‘fruit_time’: 0.5,
‘super_time’: 0.5,
‘total_time’: 1,
‘buy’:{‘gold’:2, } ,
‘harvest_fruit’: 1,
‘harvest_super’: 1,
‘sale’: 1,
‘level_need’: 0,
‘experience’ : 2,
‘exp_fruit’: 1,
‘exp_super’: 1,
‘used’: true,
},
‘1’:{
‘interval’ : 0.3,
‘probability’ : {
’98’: {‘chips’ : (5, 25), },
‘2’ : {‘gem’ : (1,1), },
},
},
‘2’:{
‘unlock’ : {‘chips’:1000, ‘fc’:10,},
‘interval’ : 12,
‘probability’ : {
’70’: {‘chips’ : (120, 250), },
’20’: {‘gem’ : (1,1), },
’10’: {‘gem’ : (2,2), },
},
},
‘one’:{
‘10,5’ :{‘id’:’m01′, ‘y’:1, ‘msg’:u’在罐子里发现了一个银币!’,},
‘3,7’ :{‘id’:’m02′, ‘y’:10,’msg’:u’发现了十个银币!好大一笔钱!’,},
‘15,5’ :{‘id’:’m03′, ‘y’:2, ‘msg’:u’一只老鼠跑了过去’,},
‘7,4’ :{‘id’:’m04′, ‘y’:4, ‘msg’:u’发现了四个生锈的银币……’,},
‘2,12’ :{‘id’:’m05′, ‘y’:6, ‘msg’:u’六个闪亮的银币!’,},
},
}
start_time = time.time()
print “start_time:”, start_time
j = 1
while true:
j += 1
a = json.dumps(test_data)
data_length = len(a)
end_time = time.time()
if end_time – start_time >= 1 :
break
print “loop_num:”, j
print “end_time: “,end_time
print data_length ,a

总结:python自带的json,性能可以接受。simplejson,如果没有c扩展加速,效率极其低下。

Posted in 未分类

发表评论