# -*- coding: utf-8 -*-

# python:2.x

__author__ = 'Administrator'

import json

#全称(javascript object notation)是一种轻量级数据交换格式,特点:角球阅读和编写,同时角球机器解析和生成,基于javascript program ming language,standard ecma-262

# 3rd editon -december 1999一个子集,json采用完全独立于语言文本格式,但是也使用了类似于c语言家庭习惯(包括c++,c,c#javajs,python等)

"""

JSON建构于两种结构:

'名称/值'对的集合(a collection of name/value pairs)不同的语言中,被理解为对象,纪录,结构,字典,哈希列表或者关联数组

jso官方说明参见:http://json.org/

Python操作json的标准api库参考:http://docs.python.org/library/json.html

"""

#简单的数据类型encoding和decoding进行编码处理如下:

obj=[[1,2,3],123,123.123,'abc',{'key1':(1,2,3),'key2':(4,5,6)}]

encodingjson=json.dumps(obj)

print repr(obj)

print encodingjson

#encode和原始repr()输出的结果非常相似,但是有些数据类型进行改变,例如上面的元素则转换成列表了,在json编码过程中,会存在从python原始类型向json类型转换过程

#对应如下表:

"""

python    json

dict      object

list,tuple  array(数组)

str,unicode string

int,long,float number

True          true

False         false

None          null

"""

print

#json.dumps()方法返回了一个str对象的encodedjson,如果想要得到原始数据,可以使用json.loads()函数,如下:

decodejson=json.loads(encodingjson)

print type(decodejson)

print decodejson[4]['key1']

print decodejson

#loads方法返回了原始对象,但是仍然发现了一些数据类型转换,如上面的'abc'转换成unicode类型,从json到python类型转换如下

"""

json       python

object       dict

array        list

string       unicode

number(int)/number(real)     int,long/float

true/false     True/False

null           None

"""

#json.dumps方法还提供了很多好用的参数,比较常用的是sort_keys(对dict对象进行排序,dict是无序存放的),separators(分离器),indent(缩进)等参数

#排序

print

data1 = {'b':789,'c':456,'a':123}

data2 = {'a':123,'b':789,'c':456}

d1=json.dumps(data1,sort_keys=True)

d2=json.dumps(data2)

d3=json.dumps(data2,sort_keys=True)

print d1

print d2

print d3

print d1==d2

print d1==d3

"""

由于dict存储的无序特性,造成两者无法比较。因此两者可以通过排序后的结果进行存储就避免了数据比较不一致的情况发生,但是排序后再进行存储,系统必定要多做一些事情,也一定会因此造成一定的性能消耗,所以适当排序是很重要的。

"""

print

#indent参数是缩进的意思,可以让数据存储格式变得更加优雅

d1=json.dumps(data1,sort_keys=True,indent=4)

#dumps(obj, 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)

print d1

print

"""

输出的数据被格式化之后,变得可读性更强,但是却是通过增加一些冗余的空白格来进行填充的。json主要是作为一种数据通信的格式存在的,而网络通信是很在乎数据的大小的,无用的空格会占据很多通信带宽,所以适当时候也要对数据进行压缩。separator参数可以起到这样的作用,该参数传递是一个元组,包含分割对象的字符串。

"""

print 'data:',repr(data1)

print 'repr(data)               :',len(repr(data1))

print 'dumps(data)              :',len(json.dumps(data1))

print 'dumps(data,indent=2)     :',len(json.dumps(data1,indent=4))

print 'dumps(data,separators):    ',len(json.dumps(data1,separators=(',',':')))

#通过移除separators多余的空白符,达到了压缩数据的目的,而且效果还是比较明显的。

print

"""

另一个比较有用的dumps参数是skipkeys,默认为False。 dumps方法存储dict对象时,key必须是str类型,如果出现了其他类型的话,那么会产生TypeError异常,如果开启该参数,设为True的话,则会比较优雅的过度。

"""

data={'b':789,'c':456,(1,2):123}

print json.dumps(data,skipkeys=True)

print

print

print

print

# #处理自己的数据类型

# #如下:

# class P(object):

#     def __init__(self,name,age):

#         self.name=name

#         self.age=age

#     def __repr__(self):

#         return 'P object name %s and age %s'%(self.name,self.age)

# if __name__=='__main__':

#     p1=P('Peter',22)

#     print p1

"""

当直接通过json.dumps方法对P的实例进行处理的话,会报错,因为json无法通过这样的自动转换,因为object类型和dict类型相似,所以把自定义类型转换为dict

然后再进行处理,有2种方法

"""

#方法1L自己写转换函数

print

#如下:

import Pa

p=Pa.P('Peter',22)

def object2dict(obj):

#convert object to a dict对象转换为一个字典

d={}

d['__class__']=obj.__class__.__name__

d['__module__']=obj.__module__

d.update(obj.__dict__)

return d

def dict2object(d):

#convert dict to object转换字典对象

if '__class__' in d:

class_name=d.pop('__class__')

module_name=d.pop('__module__')

module=__import__(module_name)

class_=getattr(module,class_name)

args = dict((key.encode('ascii'), value) for key, value in d.items())#get args

inst=class_(**args) #create new instance

else:

inst=d

return inst

d=object2dict(p)

print d#{'age': 22, '__module__': 'Person', '__class__': 'Person', 'name': 'Peter'}

o = dict2object(d)

print type(o),o#<class 'Pa.P'> P object name Peter and age 22

dump=json.dumps(p,default=object2dict)

print dump#{"age": 22, "__module__": "Pa", "__class__": "P", "name": "Peter"}

load=json.loads(dump,object_hook=dict2object)

print load#P object name Peter and age 22

"""

质就是自定义object类型和dict类型进行转化。object2dict函数将对象模块名、类名以及__dict__存储在dict对象里,并返回。dict2object函数则是反解出模块名、类名、参数,创建新的对象并返回。在json.dumps 方法中增加default参数,

该参数表示在转化过程中调用指定的函数,同样在decode过程中json.loads方法增加object_hook,指定转化函数

"""

#方法二:继承JSONEncoder和JSONDecoder类,覆写相关方法

"""

JSONEncoder类负责编码,主要是通过其default函数进行转化,我们可以override该方法。同理对于JSONDecoder。

"""

p =Pa.P('Peter',22)

class MyEncoder(json.JSONEncoder):

def default(self, obj):

#convert object to a dict

d = {}

d['__class__'] = obj.__class__.__name__

d['__module__'] = obj.__module__

d.update(obj.__dict__)

return d

class MyDecoder(json.JSONDecoder):

def __init__(self):

json.JSONDecoder.__init__(self,object_hook=self.dict2object)

def dict2object(self,d):

#convert dict to object

if'__class__' in d:

class_name = d.pop('__class__')

module_name = d.pop('__module__')

module = __import__(module_name)

class_ = getattr(module,class_name)

args = dict((key.encode('ascii'), value) for key, value in d.items()) #get args

inst = class_(**args) #create new instance

else:

inst = d

return inst

d = MyEncoder().encode(p)

o =  MyDecoder().decode(d)

print d

print type(o), o

python json基础学习01的更多相关文章

  1. Python入门基础学习 三

    Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...

  2. Python入门基础学习 二

    Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...

  3. Python入门基础学习 一

    Python入门基础学习 一 Python下载及安装 下载地址:https://www.python.org/,选择最新的版本下载 稍等一会,安装完成. 简单语句 从idle启动Python:IDLE ...

  4. python函数基础学习

    函数的定义与调用: def 函数名(参数1,参数2): ‘’’函数注释’’’ print(‘函数体’) return 返回值 定  义:def关键字开关,空格之后接函数名和圆括号,最后冒号结尾 def ...

  5. Python入门基础学习(文件与异常处理)

    Python基础学习笔记(七) 捕获异常的语法格式: 文件的基本操作: 打开文件 读.写文件 关闭文件 read方法 --读取文件: open函数的第一个参数是要打开的文件名(文件名区分大小写) 如果 ...

  6. Python入门基础学习(时间模块,随机模块)

    Python基础学习笔记(六) time模块: 时间的三种表示方法: 1.格式化字符串 2.时间戳 用来表示和1970年的时间间隔,单位为s 3.元组 struct_time 9个元素 time的st ...

  7. Python入门基础学习(模块,包)

    Python基础学习笔记(五) 模块的概念:模块是python程序架构的一个核心概念 每个以拓展名py结尾的python源代码文件都是一个模块 模块名同样也是一个标识符,需要符合标识符的命名规则 在模 ...

  8. Python入门基础学习(面向对象)

    Python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...

  9. Python入门基础学习(函数)

    Python基础学习笔记(三) 函数的概念: 所谓函数,就是把具有独立功能的代码块组织为一个小模块,在需要的时候调用 函数的使用包含两个步骤: 1.定义函数 --封装独立的功能 2.调用函数 --享受 ...

随机推荐

  1. (转)iOS7界面设计规范(11) - UI基础 - 图标与图形

    不知别人如何,我自己来讲,平时很习惯很有动力去做的一些事,譬如博客吧,一旦生活中出现一些让自己很难受的状况,就很容易受到影响:像是,你平时所习惯的生活状态都是基于某种东西的,一旦这种东西崩塌,会影响到 ...

  2. 未知宽高div水平垂直居中3种方法

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head&g ...

  3. C++11 多线程 教学(2)

      C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等, ...

  4. CentOS 6.5 升级内核 kernel

    本文适用于CentOS 6.5, CentOS 6.6,亲测可行,估计也适用于其他Linux发行版. 1. 准备工作 1.1 下载源码包 Linux内核版本有两种:稳定版和开发版 ,Linux内核版本 ...

  5. 浪潮服务器通过ipmitool获取mac地址

    一.GPU服务器 #配置两个主板集成千兆四个外插PCI万兆网卡# 板载网卡可以使用命令获取到:RAW 0X30 0X21 就可以读取到第一块网卡的MAC,就是以下返回值的后6位. 0c,c4,7a,5 ...

  6. asp Eval()函数的一些使用总结

    一.函数的原型: Eval(string s); s可以是变量,表达式,语句: 二.使用: 1.s为变量时,返回该变量的值,如:string s = "sss";Eval(s);/ ...

  7. AndroidAnnotations框架配置

    如今Android Studio的普及,Android开发基本要舍弃Eclipse了,最近使用AndroidAnnotations 注解框架的时候,找了些资料慢慢整出来了,在这给大家简单分享一下: 首 ...

  8. Merge Sorted Array 合并数组并排序

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...

  9. 委托,匿名方法,Lambda,泛型委托,表达式树

    一.委托:完成一个委托应分三个步骤://step01:首先用delegate定义一个委托;public delegate int CalculatorAdd(int x, int y);//step0 ...

  10. ZJOI 最小割 CQOI 不同的最小割 (最小割分治)

    题目1 ZJOI 最小割 题目大意: 求一个无向带权图两点间的最小割,询问小于等于c的点对有多少. 算法讨论: 最小割 分治 代码: #include <cstdlib> #include ...