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