详解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面向对象编程基础解析(二)
Oct 26 Python
用python实现对比两张图片的不同
Feb 05 Python
Python实现XML文件解析的示例代码
Feb 05 Python
机器学习之KNN算法原理及Python实现方法详解
Jul 09 Python
Python3中列表list合并的四种方法
Apr 19 Python
python修改FTP服务器上的文件名
Sep 11 Python
tensorflow tf.train.batch之数据批量读取方式
Jan 20 Python
python如何求数组连续最大和的示例代码
Feb 04 Python
在Sublime Editor中配置Python环境的详细教程
May 03 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
Jul 09 Python
详解Python爬虫爬取博客园问题列表所有的问题
Jan 18 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下intval()和(int)转换使用与区别
2008/07/18 PHP
处理php自动反斜杠的函数代码
2010/01/05 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
javascript document.compatMode兼容性
2010/02/23 Javascript
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
记一次Vue.js混入mixin的使用(分权限管理页面)
2019/04/17 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
vue-router定义元信息meta操作
2020/12/07 Vue.js
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
Python分治法定义与应用实例详解
2017/07/28 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
植物选择:Botanic Choice
2017/02/15 全球购物
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
企业安全生产责任书范本
2014/07/28 职场文书
外出考察学习心得体会
2016/01/18 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
MySQL读取JSON转换的方式
2022/03/18 MySQL
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle