概念

序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON、XML等。反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象。

JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集。

Python2.6开始加入了JSON模块,无需另外下载,Python的Json模块序列化与反序列化的过程分别是 encoding和 decoding

encoding:把一个Python对象编码转换成Json字符串
decoding:把Json格式字符串解码转换成Python对象
对于简单数据类型(string、unicode、int、float、list、tuple、dict),可以直接处理。

json.dumps方法对简单数据类型encoding:
  1. import json
  2. data = [{'a':"A",'b':(2,4),'c':3.0}] #list对象
  3. print "DATA:",repr(data)
  4. data_string = json.dumps(data)
  5. print "JSON:",data_string

输出:

  1. DATA: [{'a':'A','c':3.0,'b':(2,4)}] #python的dict类型的数据是没有顺序存储的
  2. JSON: [{"a":"A","c":3.0,"b":[2,4]}]

JSON的输出结果与DATA很相似,除了一些微妙的变化,如python的元组类型变成了Json的数组,Python到Json的编码转换规则是: 

json.loads方法处理简单数据类型的decoding(解码)转换
  1. import json
  2. data = [{'a':"A",'b':(2,4),'c':3.0}] #list对象
  3. data_string = json.dumps(data)
  4. print "ENCODED:",data_string
  5. decoded = json.loads(data_string)
  6. print "DECODED:",decoded
  7. print "ORIGINAL:",type(data[0]['b'])
  8. print "DECODED:",type(decoded[0]['b'])

输出:

  1. ENCODED: [{"a": "A", "c": 3.0, "b": [2, 4]}]
  2. DECODED: [{u'a': u'A', u'c': 3.0, u'b': [2, 4]}]
  3. ORIGINAL: <type 'tuple'>
  4. DECODED: <type 'list'>

解码过程中,json的数组最终转换成了python的list,而不是最初的tuple类型,Json到Python的解码规则是: 

json的人文关怀

编码后的json格式字符串紧凑的输出,而且也没有顺序,因此dumps方法提供了一些可选的参数,让输出的格式提高可读性,如sort_keys是告诉编码器按照字典排序(a到z)输出。

  1. import json
  2. data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
  3. print 'DATA:', repr(data)
  4. unsorted = json.dumps(data)
  5. print 'JSON:', json.dumps(data)
  6. print 'SORT:', json.dumps(data, sort_keys=True)

输出:

  1. DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
  2. JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]
  3. SORT: [{"a": "A", "b": [2, 4], "c": 3.0}

indent参数根据数据格式缩进显示,读起来更加清晰:

  1. import json
  2. data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
  3. print 'DATA:', repr(data)
  4. print 'NORMAL:', json.dumps(data, sort_keys=True)
  5. print 'INDENT:', json.dumps(data, sort_keys=True, indent=2)

输出:

  1. DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
  2. NORMAL: [{"a": "A", "b": [2, 4], "c": 3.0}]
  3. INDENT: [
  4. {
  5. "a": "A",
  6. "b": [
  7. 2,
  8. 4
  9. ],
  10. "c": 3.0
  11. }
  12. ]

separators参数的作用是去掉,,:后面的空格,从上面的输出结果都能看到", :"后面都有个空格,这都是为了美化输出结果的作用,但是在我们传输数据的过程中,越精简越好,冗余的东西全部去掉,因此就可以加上separators参数:

  1. import json
  2. data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
  3. print 'DATA:', repr(data)
  4. print 'repr(data) :', len(repr(data))
  5. print 'dumps(data) :', len(json.dumps(data))
  6. print 'dumps(data, indent=2) :', len(json.dumps(data, indent=2))
  7. print 'dumps(data, separators):', len(json.dumps(data, separators=(',',':')))

输出:

  1. DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
  2. repr(data) : 35
  3. dumps(data) : 35
  4. dumps(data, indent=2) : 76
  5. dumps(data, separators): 29

skipkeys参数,在encoding过程中,dict对象的key只可以是string对象,如果是其他类型,那么在编码过程中就会抛出ValueError的异常。skipkeys可以跳过那些非string对象当作key的处理.

  1. import json
  2. data= [ { 'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ]
  3. try:
  4. print json.dumps(data)
  5. except (TypeError, ValueError) as err:
  6. print 'ERROR:', err
  7. print
  8. print json.dumps(data, skipkeys=True)

输出:

  1. ERROR: keys must be a string
  2. [{"a": "A", "c": 3.0, "b": [2, 4]}]
  3.  
  4. http://liuzhijun.iteye.com/blog/1859857

python操作json的更多相关文章

  1. python操作json来存储简单的数据,pickle来操作复杂的数据

    json作为不同语言间进行数据交互的媒介,在当下已经渐渐取代了之前的xml,看一波python操作json # coding = ascii import json import pickle imp ...

  2. python 操作json

    认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - Dece ...

  3. 使用python操作json文本文件

    使用python读写文本文件内容时,我们知道如果文本文件里的内容无规律,那么修改起来比较麻烦.但是如果文本文件存储是有规律的,比如JSON格式,在利用python内置的函数把JSON格式的数据转成py ...

  4. python操作json数据格式--基础

    非常基础的json库的用法,后续添加数据格式.编码等内容 参考文章 json进阶 Python的json模块提供了一种很简单的方式来编码和解码JSON数据. 其中两个主要的函数是 json.dumps ...

  5. Python操作JSON数据代码示例

    #!/usr/bin/env python import json import os def json_test(): return_dic = {} json_data = { 'appid':' ...

  6. python操作json文件获取内容

    写case时,将case 写到json文件比写到,写python一定要学会处理json 以下,是要处理的json 处理操作包括:打开json文件,获取json文件内容,关闭json文件,读取内容中的对 ...

  7. python操作json文件

    import json class OperationJson(object): def __init__(self,file_name=None): if file_name: self.file_ ...

  8. python 操作json数据

    简介 JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式,通常是以键值对的方式呈现,其简洁和清晰的层次结构使得JSON成为理想的数据交换语言,而 ...

  9. Json概述以及python对json的相关操作

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Langu ...

随机推荐

  1. 【Convert Sorted List to Binary Search Tree】cpp

    题目: Given a singly linked list where elements are sorted in ascending order, convert it to a height ...

  2. php sso单点登录原理阐述

    原理:就是用户登录了单点登录系统(sso)之后,就可以免登录形式进入相关系统: 实现: 点击登录跳转到SSO登录页面并带上当前应用的callback地址 登录成功后生成COOKIE并将COOKIE传给 ...

  3. 将通过find命令找到的文件拷贝到一个新的目录中

    将通过find命令找到的文件拷贝到一个新的目录中 有这样的一个需求,需要将一部分符合条件的文件从一个目录拷贝到另一个目录中,我通过find命令从源目录查找到符合条件的文件然后使用cp命令拷贝到目标目录 ...

  4. Ext通过后台校验字段是否重复

    话不多说,直接上代码: handlerRybh : function(textField) { Ext.Ajax.request({// ajax请求的方法 url : 'userManage/per ...

  5. win8 修改msconfig 里面的"引导高级选项" 最大内存后 BSOD的解决方案

    最近由于本人的电脑一直非常卡,于11.4日通过win8任务管理器分析发现 Peer Name Resolution Protocol Peer Networking Grouping Peer Net ...

  6. 在线最优化求解(Online Optimization)之五:FTRL

    在线最优化求解(Online Optimization)之五:FTRL 在上一篇博文中中我们从原理上定性比较了L1-FOBOS和L1-RDA在稀疏性上的表现.有实验证明,L1-FOBOS这一类基于梯度 ...

  7. 转载淘宝UED响应十日谈

    响应式十日谈:楔子 响应式十日谈第一日:使用 rem 设置文字大小

  8. 大漠推荐的教程:创建你自己的AngularJS -- 第一部分 Scopes

    创建你自己的AngularJS -- 第一部分 Scopes http://www.html-js.com/article/1863

  9. 还原TexturePacker plist 文件以及图片的方法 (切开各小图片)

    原地址:http://blog.csdn.net/linuxchen/article/details/16865645 Python 脚本:(来自网络) unpack_plist.py 命令行: py ...

  10. photoshop基础

    在Photoshop中,对图像的某个部分进行色彩调整,就必须有一个指定的过程.这个指定的过程称为选取.选取后形成选区. 现在先明确两个概念: 选区是封闭的区域,可以是任何形状,但一定是封闭的.不存在开 ...