详解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生成pdf文件的方法
Aug 04 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
通过Pandas读取大文件的实例
Jun 07 Python
python networkx 根据图的权重画图实现
Jul 10 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
Feb 27 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
用python写爬虫简单吗
Jul 28 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
Oct 15 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
python中 .npy文件的读写操作实例
Apr 14 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
PHP 时间日期操作实战
2011/08/26 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
JS 自动安装exe程序
2008/11/30 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
python文件操作整理汇总
2014/10/21 Python
python复制与引用用法分析
2015/04/08 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
Django获取应用下的所有models的例子
2019/08/30 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
Python实现画图软件功能方法详解
2020/07/28 Python
Python利用命名空间解析XML文档
2020/08/10 Python
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
UNIX文件类型
2013/08/29 面试题
园艺师求职信
2014/03/10 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
python 常用的异步框架汇总整理
2021/06/18 Python