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.jfrwli.cn"} { 屬性 : 值 , 屬性 : 值 , 屬性 : 值 }
2.2,數組:
是有順序的值的集合。一個數組開始于"[",結束于"]",值之間用","分隔。
[ {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www.jfrwli.cn"}, {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www.jfrwli.cn"}, {name:"Peggy",email:"peggy@gmail.com",homepage:"http://www.jfrwli.cn"} ]
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文件如下:
#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'] //查看字典的方法! '杭州德勝機房' >>> 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擴展加速,效率極其低下。