详解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 (1)
Oct 31 Python
Python yield 小结和实例
Apr 25 Python
python将图片文件转换成base64编码的方法
Mar 14 Python
Python制作爬虫采集小说
Oct 25 Python
教你学会使用Python正则表达式
Sep 07 Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
Mar 15 Python
详解Python 正则表达式模块
Nov 05 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
Python获取Redis所有Key以及内容的方法
Feb 19 Python
Python实现最大子序和的方法示例
Jul 05 Python
pymysql 开启调试模式的实现
Sep 24 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+mysql)
2007/11/23 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
PHP添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
WAF的正确bypass
2017/01/05 PHP
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
javascript add event remove event
2008/04/07 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
Jquery性能优化详解
2014/05/15 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
ionic环境配置及问题详解
2017/06/27 Javascript
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
Python通过解析网页实现看报程序的方法
2014/08/04 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
python匿名函数用法实例分析
2019/08/03 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
keras topN显示,自编写代码案例
2020/07/03 Python
通俗讲解python 装饰器
2020/09/07 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
环境科学专业个人求职的自我评价
2013/11/28 职场文书
绿色城市实施方案
2014/03/19 职场文书
幼儿园儿童节主持词
2014/03/21 职场文书
残疾人小组计划书
2014/04/27 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
redis限流的实际应用
2021/04/24 Redis
一文搞懂redux在react中的初步用法
2021/06/09 Javascript
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL