Python处理JSON

(如果阅读效果不佳,可戳这里)

概念

序列化(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:

import json

data = [{'a':"A",'b':(2,4),'c':3.0}] #list对象

print "DATA:",repr(data)

data_string = json.dumps(data)

print "JSON:",data_string

输出:

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

JSON: [{"a":"A","c":3.0,"b":[2,4]}]

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

json.loads方法处理简单数据类型的decoding(解码)转换

import json

data = [{'a':"A",'b':(2,4),'c':3.0}] #list对象

data_string = json.dumps(data)

print "ENCODED:",data_string

decoded = json.loads(data_string)

print "DECODED:",decoded

print "ORIGINAL:",type(data[0]['b'])

print "DECODED:",type(decoded[0]['b'])

输出:

ENCODED: [{"a": "A", "c": 3.0, "b": [2, 4]}]

DECODED: [{u'a': u'A', u'c': 3.0, u'b': [2, 4]}]

ORIGINAL:

DECODED:

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

json的人文关怀

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

import json

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]

print 'DATA:', repr(data)

unsorted = json.dumps(data)

print 'JSON:', json.dumps(data)

print 'SORT:', json.dumps(data, sort_keys=True)

输出:

DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]

JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]

SORT: [{"a": "A", "b": [2, 4], "c": 3.0}

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

import json

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]

print 'DATA:', repr(data)

print 'NORMAL:', json.dumps(data, sort_keys=True)

print 'INDENT:', json.dumps(data, sort_keys=True, indent=2)

输出:

DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]

NORMAL: [{"a": "A", "b": [2, 4], "c": 3.0}]

INDENT: [

{

"a": "A",

"b": [

2,

4

],

"c": 3.0

}

]

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

import json

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]

print 'DATA:', repr(data)

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

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

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

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

输出:

DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]

repr(data) : 35

dumps(data) : 35

dumps(data, indent=2) : 76

dumps(data, separators): 29

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

import json

data= [ { 'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ]

try:

print json.dumps(data)

except (TypeError, ValueError) as err:

print 'ERROR:', err

print

print json.dumps(data, skipkeys=True)

输出:

ERROR: keys must be a string

[{"a": "A", "c": 3.0, "b": [2, 4]}]

让json支持自定义数据类型

以上例子都是基于python的built-in类型的,对于自定义类型的数据结构,json模块默认是没法处理的,会抛出异常:TypeError xx is not JSON serializable,此时你需要自定义一个转换函数:

import json

class MyObj(object):

def __init__(self, s):

self.s = s

def __repr__(self):

return '' % self.s

obj = .MyObj('helloworld')

try:

print json.dumps(obj)

except TypeError, err:

print 'ERROR:', err

#转换函数

def convert_to_builtin_type(obj):

print 'default(', repr(obj), ')'

# 把MyObj对象转换成dict类型的对象

d = { '__class__':obj.__class__.__name__,

'__module__':obj.__module__,

}

d.update(obj.__dict__)

return d

print json.dumps(obj, default=convert_to_builtin_type)

输出:

ERROR: is not JSON serializable

default( )

{"s": "hellworld", "__module__": "MyObj", "__class__": "__main__"}

#注意:这里的class和module根据你代码的所在文件位置不同而不同

相反,如果要把json decode 成python对象,同样也需要自定转换函数,传递给json.loads方法的object_hook参数:

#jsontest.py

import json

class MyObj(object):

def __init__(self,s):

self.s = s

def __repr__(self):

return "" % self.s

def dict_to_object(d):

if '__class__' in d:

class_name = d.pop('__class__')

module_name = d.pop('__module__')

module = __import__(module_name)

print "MODULE:",module

class_ = getattr(module,class_name)

print "CLASS",class_

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

print 'INSTANCE ARGS:',args

inst = class_(**args)

else:

inst = d

return inst

encoded_object = '[{"s":"helloworld","__module__":"jsontest","__class__":"MyObj"}]'

myobj_instance = json.loads(encoded_object,object_hook=dict_to_object)

print myobj_instance

输出:

MODULE:

CLASS

INSTANCE ARGS: {'s': u'helloworld'}

[]

MODULE:

CLASS

INSTANCE ARGS: {'s': u'helloworld'}

[]

使用Encoder与Decoder类实现json编码的转换

JSONEncoder有一个迭代接口iterencode(data),返回一系列编码的数据,他的好处是可以方便的把逐个数据写到文件或网络流中,而不需要一次性就把数据读入内存.

import json

encoder = json.JSONEncoder()

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]

for part in encoder.iterencode(data):

print 'PART:', part

输出:

PART: [

PART: {

PART: "a"

PART: :

PART: "A"

PART: ,

PART: "c"

PART: :

PART: 3.0

PART: ,

PART: "b"

PART: :

PART: [2

PART: , 4

PART: ]

PART: }

PART: ]

encode方法等价于''.join(encoder.iterencode(),而且预先会做些错误检查(比如非字符串作为dict的key),对于自定义的对象,我们只需从些JSONEncoder的default()方法,其实现方式与上面提及的函数convet_to_builtin_type()是类似的。

import json

import json_myobj

class MyObj(object):

def __init__(self,s):

self.s = s

def __repr__(self):

return "" % self.s

class MyEncoder(json.JSONEncoder):

def default(self, obj):

print 'default(', repr(obj), ')'

# Convert objects to a dictionary of their representation

d = { '__class__':obj.__class__.__name__,

'__module__':obj.__module__,

}

d.update(obj.__dict__)

return d

obj = json_myobj.MyObj('helloworld')

print obj

print MyEncoder().encode(obj)

输出:

default( )

{"s": "helloworld", "__module__": "Myobj", "__class__": "MyObj"}

从json对Python对象的转换:

class MyDecoder(json.JSONDecoder):

def __init__(self):

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

def dict_to_object(self, d):

if '__class__' in d:

class_name = d.pop('__class__')

module_name = d.pop('__module__')

module = __import__(module_name)

print 'MODULE:', module

class_ = getattr(module, class_name)

print 'CLASS:', class_

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

print 'INSTANCE ARGS:', args

inst = class_(**args)

else:

inst = d

return inst

encoded_object = '[{"s": "helloworld", "__module__": "jsontest", "__class__": "MyObj"}]'

myobj_instance = MyDecoder().decode(encoded_object)

print myobj_instance

输出:

MODULE:

CLASS:

INSTANCE ARGS: {'s': u'helloworld'}

[]

json格式字符串写入到文件流中

上面的例子都是在内存中操作的,如果对于大数据,把他编码到一个类文件(file-like)中更合适,load()和dump()方法就可以实现这样的功能。

import json

import tempfile

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]

f = tempfile.NamedTemporaryFile(mode='w+')

json.dump(data, f)

f.flush()

print open(f.name, 'r').read()

输出:

[{"a": "A", "c": 3.0, "b": [2, 4]}]

类似的:

import json

import tempfile

f = tempfile.NamedTemporaryFile(mode='w+')

f.write('[{"a": "A", "c": 3.0, "b": [2, 4]}]')

f.flush()

f.seek(0)

print json.load(f)

输出:

[{u'a': u'A', u'c': 3.0, u'b': [2, 4]}]

python处理json_Python处理JSON相关推荐

  1. python解析json_python解析json文件

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

  2. python生成json_Python 生成json文件

    原博文 2018-04-12 17:00 − 1.数据准备 数据下载 2.python代码 import datetime import os import mssqlhelper ms = mssq ...

  3. python读写json_python 读写json数据

    json 模块提供了一种很简单的方式来编码和解码JSON 数据. 字符串操作 其中两个主要的函数是json.dumps() 和json.loads() ,要比其他序列化函数库如pickle 的接口少得 ...

  4. python使用json_Python之json使用

    一.概念 json是一种通用的数据类型,任何语言都认识 接口返回的数据类型都是json 长得像字典,形式也是k-v { } 其实json是字符串 字符串不能用key.value来取值,要先转成字典才可 ...

  5. python操作json_Python学习之利用Python处理JSON格式数据

    最近在研究利用zabbix的自动发现功能来监控一台服务器上的多个Redis端口.网上有篇文章写个Python程序来发现Redis端口并显示成JSON格式.这里就学习下Python如何处理JSON格式数 ...

  6. python中的json_python中json的使用

    在编写接口传递数据时,往往需要使用JSON对数据进行封装.python和json数据类型的转换,看作为编码与解码. 编码:json.dumps() PythonJSON dict object lis ...

  7. python生成json_python之生成多层json结构的实现

    网上关于生成多层json结构的比较少,基本都是关于添加元素,解析,怎么转化为json之类的 下面就以文章信息的json为基础来构建多层json. 生成最基本的一个json: import json a ...

  8. python 对象转换为json_Python Python对象转换成JSON

    1.从Python对象转换成JSON 如果有Python对象,则可以使用json.dumps()方法将其转换为JSON字符串. 例如: 从Python对象转换为JSON:import json # a ...

  9. python爬虫json_python爬虫数据提取一之json

    1 数据提取 什么是数据提取? 简单的来说,数据提取就是从响应中获取我们想要的数据的过程 1.1 数据分类 非结构化数据: html , 文本等 处理方法:正则表达式,xpath语法 结构化数据:js ...

最新文章

  1. 支付宝接口参数调用相关
  2. C++命名空间namespace
  3. 使用OpenCV与百度OCR C++ SDK实现文字识别
  4. spring教程--事务管理
  5. 【经验总结】VS2010下建立MFC程序
  6. mysql5.7主从同步与读写分离
  7. 算法训练 最长字符串 java
  8. 听我讲完GET、POST原理,面试官给我倒了杯卡布奇诺
  9. android消息提示方法自定义,Android自定义消息提示容器
  10. 打开无线后无法自动发现连接点的问题
  11. 2.4gwifi最高下载速度_2.4G+5G双频合一的路由器速度会更快?看完后才知道还好没上当...
  12. 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)
  13. 回顾一年的工作历程_回顾一年来的工作
  14. Spring WebFlux框架概述
  15. .Net Core 2.1 JWT Bearer 的认证
  16. etcd+skydns构建私有域名解析服务器
  17. php四六级报名考试源码,又一波省市6月四六级报名时间公布!速看!
  18. 爬取破冰行动:敢拍好看。
  19. 【mba旅游管理论文】天乐湖旅游度假区发展现状及问题分析(节选)
  20. PPT快捷键超全合集,你也可以成为PPT实操王者

热门文章

  1. 【自动驾驶】定位方式:RTK定位与激光融合定位
  2. SqlServer基础之(触发器)
  3. MySQL查看表结构的实际操作命令简介
  4. Java 基础复习实践 --- Hashcode Equals
  5. 如何理解矩阵特征值?
  6. Python配置OpenCV时报错:ImportError DLL load failed: %1 不是有效的 Win32 应用程序
  7. 【python图像处理】图像的读取、显示与保存
  8. Gradle 设置 本地maven仓库及发布mavenLocal()路径的方法
  9. postgresql 获取所有表名、字段名、字段类型、注释
  10. Andrew Ng 深度学习笔记-01-week2-课程