分享

python基础之JSON标准库

 天上飞鸡 2021-01-06

一、序列化的一些简单概念

  1. 我们平常使用的python对象所进行的操作是在内存中,当程序关闭就会被清空,所以我们需要用一种合适的方法将这些数据保存下来。
  2. 为了将我们的数据进行永久存储,需要引入序列化(pickling/serialization)的概念。
  3. 序列化的定义:将复杂的python数据结果转换成一个二进制数据集合(数据流)。反序列化:从数据流(字符串形式)重新构造复杂的python数据结构。
  4. 序列化的好处:我们可以通过网络或本地存储介质讲这些数据流保存或传输。
  5. 序列化的方法:引入json、pickling、marshal、shelve,其中最常用的是json

二、JSON标准库

2.1 基本用法
  1. json模块的序列化和反序列化方法分别是dumps和loads,json.dumps()和json.dump()将一个python对象转换成json串,json.loads()和json.load()将一个json串还原成python对象。
  2. json.dump()和json.dumps()的区别
    json.dump()处理的是文件对象,而json.dumps()处理的是字符串对象。
  3. json.load()和json.loads()的区别
    json.load()处理的是文件对象,而json.loads()处理的是字符串对象。
2.2 json.dumps()

将python的数据类型转换成json字串

语法格式:json.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)

>>> import json>>> json.dumps([])'[]'>>> json.dumps('string')''string''>>> json.dumps(1) '1'>>> json.dumps({'name':'tyson','age':23})'{'age': 23, 'name': 'tyson'}'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

使用参数能让JSON字串格式化输出:

>>> print json.dumps({'a': 'Runoob', 'b': 7}, sort_keys=True, indent=4, separators=(',', ': ')){    'a': 'Runoob',    'b': 7}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

较重要的参数:
sort_keys:是否排序
indent:定义缩进大小
separators:是一个元组,定义分隔符的类型
skipkeys:是否允许JSON字串编码字典对象时,字典的key不是字符串类型(默认是不允许)

a = ['foo', {'bar': ('baz', None, 1.0, 2)}]s = json.dumps(a, sort_keys=True, indent=4, separators=('!', '?')) #分隔符这里只是测试,一般保持默认逗号和分号即可print sresult:[ 'foo'! { 'bar'?[ 'baz'! null! 1.0! 2 ] }]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
try:    data = {'a':1, 'b':2, (1,):3}    json.dumps(data)  except TypeError,e:    print e                                #keys must be a stringprint json.dumps(data,skipkeys=True)       #{'a': 1, 'b': 2}data = {'a':1, 'b':2, 1:3}print json.dumps(data)  result:keys must be a string{'a': 1, 'b': 2}{'a': 1, '1': 3, 'b': 2} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

python原始类型向json类型的转化对照表

pythonjson
dictobject
list,tuplearray
str,unicodestring
int,long,floatnumber
Truetrue
Falsefalse
Nonenull
2.3 json.loads()

将json字串转换成python的数据类型。也就是反序列化。
语法格式:json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

json.loads('{'a':'Runoob','b':7}') {u'a': u'Runoob', u'b': 7}
  • 1
  • 2
  • 1
  • 2

json字串转换成python对象类型对照表

JSONPython
objectdict
arraylist
stringunicode
number(int)int
number(real)float
trueTrue
falseFalse
null
2.4 json.dump()

将序列化之后形成的JSON字串保存到文件。
语法格式:dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw):

#encoding:UTF-8import jsona={'name':'tyson','age':21,'sex':'boy'}#第一种方法将JSON字串写入文件中#该方法不需要closewith open('json.txt','a') as f:    f.write(json.dumps(a,indent=4))#第二种方法将JSON字串写入文件中f=open('json.txt','a')json.dump(a,f,indent=4)f.close()#json.txt{    'age': 21,     'name': 'tyson',     'sex': 'boy'}{    'age': 21,     'name': 'tyson',     'sex': 'boy'}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
2.5 json.load()

从文件接受JSON字串,并反序列化成为Python的数据类型。
语法格式:load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

#encoding:UTF-8import jsona={'name':'tyson','age':21,'sex':'boy'}#第一种方法将JSON字串写入文件中#该方法不需要closewith open('json','a') as f: f.write(json.dumps(a))#第一种方法将文件中的JSON字串转反序列化成Python的数据类型with open('json','r') as f: print json.loads(f.read())#json{'age': 21, 'name': 'tyson', 'sex': 'boy'}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

三、类的序列化

python的JSON想办法能将各种数据对象都转换为JSON,其中可选参数default就是用来提供给用户自行定义转换函数的

class student(object):    def __init__(self,name,sex,age):        self.name=name        self.sex=sex        self.age=agetyson=student('tyson','boy',21)print json.dumps(tyson,default=lambda obj:obj.__dict__)#python的JSON想办法能将各种数据对象都转换为JSON,其中可选参数default就是用来提供给用户自行定义转换函数的#所以上面的方法与下面这个是等同的def stuclass2json(classObject):    return{        'name':classObject.name,        'sex': classObject.sex,        'age':classObject.age    }print json.dumps(tyson,default=stuclass2json)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

四、多个JSON字串同时解析

一般不会遇到这种情况,待添加

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多