详解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模块 示例:

立即学习“Python免费学习笔记(深入)”;

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’: ‘杭州德胜机房’, ‘assetsNum’: ‘B50070100007003’, ‘responsibilityPerson’: ‘张之诚’, ‘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’: ‘使用中’, ‘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’: ‘中文站’}]} 
首先导入该文件,建立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']     //查看字典的方法! '杭州德胜机房' >>> 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.77loop_num: 36898end_time:  1370747464.78

登录后复制

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

2016324173247058.jpg (592×62)

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

start_time: 1370748132.87loop_num: 1361end_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扩展加速,效率极其低下。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2536232.html

(0)
上一篇 2025年3月5日 23:16:17
下一篇 2025年3月5日 23:16:22

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论