详解Python使用simplejson模块解析JSON的方法
admin
2023-07-31 02:30:34
0

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.jb51.net\"} 
{ 属性 : 值 , 属性 : 值 , 属性 : 值 } 

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

[ 
{name:\"Peggy\",email:\"peggy@gmail.com\",homepage:\"http://www.jb51.net\"}, {name:\"Peggy\",email:\"peggy@gmail.com\",homepage:\"http://www.jb51.net\"}, 
{name:\"Peggy\",email:\"peggy@gmail.com\",homepage:\"http://www.jb51.net\"} 
] 

另,值可以是字符串、数字、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)# 

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

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

>>>type(ddata[\'data\']) 
 

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

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

>>> type(ddata[\'data\'][0]) 
 

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扩展的情况下:

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(\'清新,淡雅,花香\', \'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扩展加速,效率极其低下。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...