一、关于JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.是一种文件规范,绝大多数的编程语言均可以轻松读写.当然python也不例外.
本文要讲的主要是python对JSON数据的序列化和反序列化.所谓序列化就是写入到文件,反序列化就是从文件中写读到到程序中成为对应语言的数据类型.
python数据类型与JSON格式的对照表:

Python JSON
dict object
list,tuple array
str,unicode string
int,long,float number
True true
False false
None null

二、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)))

输出结果:

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=None, encoding='utf-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_hook=None, **kw)** Deserialize **``fp`` (a ``.read()``-supporting file-like object containinga JSON document) to a Python object.

整明白了概念和常用的函数,接下来我们来看一个实例.
此实例是阿里去一个获取笑话的api:

#!/usr/bin/python
import urllib, urllib2, sys
import json
reload(sys)
sys.setdefaultencoding('utf-8')host = 'http://jisuxhdq.market.alicloudapi.com'
path = '/xiaohua/text'
method = 'GET'
appcode = '30a0e07268fafdafafaf7b54914b06b5'
#querys = 'pagenum=1&pagesize=1&sort=addtime'   #默认是第1页第1条,需要修改
querys = 'pagenum=%s&pagesize=5&sort=addtime' %sys.argv[1]    #pagenum是页码,pagesize是每页显示几条;此处是修改
bodys = {}
url = host + path + '?' + querys
try:    ##try except是修改后的,原本没有request = urllib2.Request(url)request.add_header('Authorization', 'APPCODE ' + appcode)response = urllib2.urlopen(request)content = response.read()
except:print('argv error!')
#print content
#######以下是添加:
if (content):xiaohua = json.loads(content,encoding='utf-8')       ###反序列化成dictfor i in range(5):print(str(sys.argv[1]) + ":" + str(i) + "," +  xiaohua["result"]["list"][i]["content"])with open("xiaohua.txt",'a+') as f:if (str(sys.argv[1]) + ":" + str(i) + "," + "\n") in f.readlines():     #判断是否已经存放在文件中continuef.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","loadStatus": 3,"url": ["http://10.247.12.92/zhmjServer/"],"isPublic": true,"nameId": "10001"},{"chName": "倾国倾城","tag": "hunfu,ios","phyId": 1,"zoneId": 2,"localIP": "192.168.100.168","loadStatus": 3,"url": ["http://10.247.12.92/zhmjServer/"],"isPublic": true,"nameId": "10012"}
]

反序列化,从以下game.json中读取配置信息
代码:

#coding:utf-8
import 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 = ['http://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" % localIPGameSrv["tag"] = u"%s" % tagGameSrv["url"] = urlGameSrv["phyId"] = 1GameSrv["nameId"] = str(NameId)GameSrv["chName"] = u"%s" % GameNameGameSrv["isPublic"] = FalseGameSrv["zoneId"] = int(zoneId)GameSrv["loadStatus"] = 0old_games.append(GameSrv)repr(old_games)f = open("game.json",'w+')       #创建写入文件对象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.
用错了地方则会出错.

转载于:https://blog.51cto.com/dyc2005/2052451

JSON数据序列化与反序列化实战相关推荐

  1. python序列化和反序列化_Python 中 json 数据序列化和反序列化

    1.Json 定义 定义:JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.JSON 的数据格式其实就是 python 里面的字典格式,里 ...

  2. 在C#中,Json的序列化和反序列化的几种方式总结

    在C#中,Json的序列化和反序列化的几种方式总结 在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (Ja ...

  3. ASP.NET中JSON的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  4. Newtonsoft.Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化. 创建 ...

  5. Json.Net系列教程 3.Json.Net序列化和反序列化设置

    上节补充 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列 ...

  6. java newtonsoft.json_Newtonsoft.Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化. 创建 ...

  7. 一起谈.NET技术,ASP.NET 中JSON 的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  8. C#中的Json的序列化和反序列化

    Json是一种通用的数据格式,我们在数据交换的时候,经常会用到,下面介绍c#中的json序列化和反序列化,当然也可用在asp.net,silverlight,wpf中.我们在下面实例讲解如何进行Jso ...

  9. Json的序列化和反序列化

    1.引用命名空间: using System.Runtime.Serialization; 2.json的序列化和反序列化的方法: publicclass JsonHelper { ///<su ...

最新文章

  1. Linux安装HDF5及遇到的问题总结
  2. 《今日简史》读书笔记(未完待续)
  3. JSON数据的HTTP Header应该怎么标记?
  4. oracle 中update多个字段
  5. oracle确实表达式,ORACLE正规表达式
  6. mysql和hdfs性能对比,Hadoop vs Spark性能对比 -数据库-火龙果软件工程
  7. JFinal(一)JFinalConfig
  8. Java 多态的特性和概念
  9. xna中的截屏操作处理
  10. Python3 - 字符串
  11. 软件需求规格说明书_4.软件需求最佳实践笔记 | 软件需求与需求工程
  12. 十四届恩智浦智能车竞赛双车组-星夜兼程队2019回顾
  13. 收藏到一个好的java时间格式大全(类)
  14. Elasticsearch 7.13 删除文档后如何释放存储空间、手动执行forcemerge操作
  15. pdf图片转换成word文字
  16. leafy tree
  17. 可以指定列fillna吗_京东e卡可以购买指定的京东自营商品?是真的吗
  18. 基于单片机的模拟电磁曲炮设计
  19. 一年303个漏洞,Chrome被评为“最脆弱”浏览器,Opera 最安全!网友:Opera 还有人用?...
  20. HBase2.x(七)Master 架构

热门文章

  1. 《转载》IOS高级开发~开机启动无限后台运行监听进程
  2. Session的lock()方法
  3. Web跨浏览器进程通信
  4. An eventually consistent data model for Erlang (and Riak)
  5. pandas.DataFrame.groupby
  6. SQL中的SqlConnection连接方式
  7. iOS: 零误差或极小误差的定时执行或延迟执行?
  8. mybatis 1 - 获取自增ID
  9. Android 启动模式简介
  10. unix实际用户ID和有效用户ID解析