加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

详解Python使用simplejson模块解析JSON的方法

发布时间:2020-12-16 20:51:25 所属栏目:Python 来源:网络整理
导读:1,Json模块介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language,Standard ECMA-262 3rd Edition - December 1999的一个子集。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.aspzz.cn"} 
{ 属性 : 值,属性 : 值,属性 : 值 } 

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

[ 
{name:"Peggy",homepage:"http://www.aspzz.cn"},{name:"Peggy",homepage:"http://www.aspzz.cn"} 
] 

另,值可以是字符串、数字、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': 'xe6x9dxadxe5xb7x9exe5xbexb7xe8x83x9cxe6x9cxbaxe6x88xbf','assetsNum': 'B50070100007003','responsibilityPerson': 'xe5xbcxa0xe4xb9x8bxe8xafx9a','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': 'xe4xbdxbfxe7x94xa8xe4xb8xad','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': 'xe4xb8xadxe6x96x87xe7xabx99'}]} 
首先导入该文件,建立Json对象,并查看类型,已经是dict类型了。
#test.py 
import simplejson as json 
ddata = json.loads(file("data.json")) 
print ddata 
print type(ddata)#<type 'dict'> 

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

>>> ddata['data']  //查看字典的方法!

>>>type(ddata['data']) 
<type 'list'> 

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

>>> ddata['data'][0]     //查看列表的方法!

>>> type(ddata['data'][0]) 
<type 'dict'> 

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

>>> ddata['data'][0]['idc']     //查看字典的方法!

>>> ddata['data'][0]['idc']     //查看字典的方法! 
'xe6x9dxadxe5xb7x9exe5xbexb7xe8x83x9cxe6x9cxbaxe6x88xbf' 
>>> 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('清新,淡雅,花香','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,'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扩展加速,效率极其低下。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读