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


Posted in Python onMarch 24, 2016

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:"https://3water.com"} 
{ 属性 : 值 , 属性 : 值 , 属性 : 值 }

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

[ 
{name:"Peggy",email:"peggy@gmail.com",homepage:"https://3water.com"}, {name:"Peggy",email:"peggy@gmail.com",homepage:"https://3water.com"}, 
{name:"Peggy",email:"peggy@gmail.com",homepage:"https://3water.com"} 
]
另,值可以是字符串、数字、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)#<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']     //查看字典的方法! 
'\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扩展的情况下:

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

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扩展加速,效率极其低下。

Python 相关文章推荐
解析Python中的变量、引用、拷贝和作用域的问题
Apr 07 Python
Python模拟登陆实现代码
Jun 14 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
Python实现返回数组中第i小元素的方法示例
Dec 04 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
Sep 04 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
Python实现括号匹配方法详解
Feb 10 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
Feb 29 Python
Python任务调度模块APScheduler使用
Apr 15 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
python编程的核心知识点总结
Feb 08 Python
解决Python出现_warn_unsafe_extraction问题的方法
Mar 24 #Python
python 回调函数和回调方法的实现分析
Mar 23 #Python
python 时间戳与格式化时间的转化实现代码
Mar 23 #Python
python各种语言间时间的转化实现代码
Mar 23 #Python
Eclipse中Python开发环境搭建简单教程
Mar 23 #Python
在windows系统中实现python3安装lxml
Mar 23 #Python
Python使用Redis实现作业调度系统(超简单)
Mar 22 #Python
You might like
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
2017/10/24 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
JQuery 学习技巧总结
2010/05/21 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
2012/03/01 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
javascript带回调函数的异步脚本载入方法实例分析
2015/07/02 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
深入浅析python with语句简介
2018/04/11 Python
Python多进程编程常用方法解析
2020/03/26 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
基于HTML5 的人脸识别活体认证的实现方法
2016/06/22 HTML / CSS
罗技美国官网:Logitech美国
2020/01/22 全球购物
实习报告评语
2014/04/26 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
公务员政审材料范文
2014/12/23 职场文书
联谊活动总结范文
2015/05/09 职场文书
居委会工作总结2015
2015/05/18 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
演讲比赛主持词
2015/06/29 职场文书
电视新闻稿
2015/07/17 职场文书
详解Laravel制作API接口
2021/05/31 PHP
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL