pythonjson序列化和反序列化_JSON数据序列化与反序列化实
⼀、关于JSON
JSON(JavaScript Object Notation) 是⼀种轻量级的数据交换格式,易于⼈阅读和编写.是⼀种⽂件规范,绝⼤多数的编程语⾔均可以轻松
计算机入门自学
读写.当然python也不例外.
本⽂要讲的主要是python对JSON数据的序列化和反序列化.所谓序列化就是写⼊到⽂件,反序列化就是从⽂件中写读到到程序中成为对应语
⾔的数据类型.
python数据类型与JSON格式的对照表:PythonJSONdictobject
list,tuplearray
str,unicodestring
int,long,floatnumber
Truetrue
Falsefalse
Nonenull
⼆、python中json库与函数
python通过导⼊json库:import json 来解析操作与序列化JSON格式⽂件.
主要通过两个函数
json.dumps是将dict转化成str格式,json.loads是将str转化成dict格式。这⼀对是⽤来做编码或叫解析与反解析JSON数据.注意这⾥没有
写⼊⽂件的功能,只是在python内部处理.因此这⾥我习惯叫做解析与反解析.
代码:import json
a = {'name': 'san', 'age': 29}
b = json.dumps(a)print(b, type(b))print("********分割线**********")print(json.loads(b),type(json.loads(b)))shelly的个人资料
输出结果:
json.dump和json.load也是类似的功能,但是这两个函数需要⽂件对象结合操作。即序列化( Serialize)与反序列化(Deserialize)
通过查看这对函数的帮助说明⽂档如下:**Help on function dump in module json:**
dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=No 8', default=None, sort_keys=False, **kw)
**  Serialize** ``obj`` as a JSON formatted stream to ``fp`` (a
``.write()``-supporting file-like object).
**Help on function load in module json:**
load(fp, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs
** Deserialize **``fp`` (a ``.read()``-supporting file-like object containing
python请求并解析json数据
a JSON document) to a Python object.
整明⽩了概念和常⽤的函数,接下来我们来看⼀个实例.
此实例是阿⾥去⼀个获取笑话的api:#!/usr/bin/pythonimport urllib, urllib2, sysimport json
reload(sys)
sys.setdefaultencoding('utf-8')
host = 'jisuxhdq.market.alicloudapi'path = '/xiaohua/text'method = 'GET'appcode = '30a0e07268fafdafafaf7b54914
默认是第1页第1条,需要修改querys = 'pagenum=%s&pagesize=5&sort=addtime' %sys.argv[1]    #p
agenum是页码,pagesize是每
页显⽰⼏条;此处是修改bodys = {}
url = host + path + '?' + querystry:    ##try except是修改后的,原本没有
request = urllib2.Request(url)
request.add_header('Authorization', 'APPCODE ' + appcode)
response = urllib2.urlopen(request)
content = ad()except:
print('argv error!')#print content>##以下是添加:if (content):
xiaohua = json.loads(content,encoding='utf-8')      ###反序列化成dict
for i in range(5):
print(str(sys.argv[1]) + ":" + str(i) + "," +  xiaohua["result"]["list"][i]
["content"])        with open("",'a+') as f:            if (str(sys.argv[1]) + ":" + str(i) + "," + "\n") adlines():    #判断
是否已经存放在⽂件中
continue
f.writelines(str(sys.argv[1]) + ":" + str(i) + "," + "\n" + xiaohua["result"]["list"][i]["content"] + "\n")  #写⼊⽂件
公司架构图
通过以上获取的str 的内容来反序列化成dict json格式,并定制获取内容后写⼊⽂件保存;
运⾏结果如下:
三、python对JSON序列化与反序列化实战
以下是JSON格式的⽂件(游戏配置⽂件)
内容⼤致如下:[
{                "phyId": 0,                "zoneId": 0,                "loadStatus": 0,                "isPublic": false,                "nameId": "user"
},
{                "phyId": 0,                "zoneId": 0,                "loadStatus": 3,                "isPublic": false,                "nameId": "misc"
},
{                "chName": "乱世枭
雄",                "tag": "hunfu,ios",                "phyId": 1,                "zoneId": 1,                "localIP": "192.168.100.168",                "loadStatu
],                "isPublic": true,                "nameId": "10001"
},
{                "chName": "倾国倾
城",                "tag": "hunfu,ios",                "phyId": 1,                "zoneId": 2,                "localIP": "192.168.100.168",                "loadStatu
],                "isPublic": true,                "nameId": "10012"
}
]
反序列化,从以下game.json中读取配置信息
代码:#coding:utf-8import jsonwith open("game.json") as game_info:
games = json.load(game_info, encoding="utf-8")for i in games:
print(i)
运⾏结果:
序列化:
向game.json中更新写⼊JSON格式流或叫更新JSON⽂件
例如向game.json中新增加⼀条游戏服配置:
所谓更新思路就是把原有的数据反解析反序列化读出,再添加新的数据,解析序列化写回⽂件.def bakSrv(NameId="",GameName="",zoneId=""):
localIP='192.168.100.168'
tag = 'hunfu,ios'
url = ['10.247.12.92/zhmjServer/']
GameSrv = {}    with open("game.json") as game_info:
old_games = json.load(game_info,encoding="utf-8")
GameSrv["localIP"] = u"%s" % localIP
GameSrv["tag"] = u"%s" % tag
ipad的免费c语言编程软件
GameSrv["url"] = url
GameSrv["phyId"] = 1
GameSrv["nameId"] = str(NameId)
GameSrv["chName"] = u"%s" % GameName
GameSrv["isPublic"] = False
GameSrv["zoneId"] = int(zoneId)
GameSrv["loadStatus"] = 0
old_games.append(GameSrv)
repr(old_games)
f = open("game.json",'w+')      #创建写⼊⽂件对象vue生命周期的作用
json.dump(old_games, f,ensure_ascii=False,indent=4,separators=(',',': ')) #
f.close()
print("***************⽣成新的JSON配置⽂件成功!****************************")
bakSrv(NameId="10003",GameName="新测试服",zoneId=4)
说明:
json.dump的参数:
注意,此处是dump函数的参数,indent是json⽂件⽣成后的缩进,默认None则输出的格式是在⼀⾏,很不美观,separators默认可不指定,可以修改成类似separators=(',\n',': \t') 如此就是加了:后的tab, ennsure_ascii默认是True 如果不修改成False你的中⽂是unicode的,所以这⾥必须指定.
此时查看game.json⽂件时会发现已经新增加了⼀条,如图:
四、总结
通过需要从⼀个JSON格式⽂件中load读出反序列化并通过dump⽣成或修改重新写⼊序列化到⼀个JSON格式的⽂件中.⽽loads与dumps 主要是python内部进⾏解析.最终要写⼊到⽂件需要dump.或从⽂件中读取⽤load.
⽤错了地⽅则会出错.
版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论