python json库函数_python基础之JSON标准库

一、序列化的一些简单概念 我们平常使用的python对象所进行的操作是在内存中,当程序关闭就会被清空,所以我们需要用一种合适的方法将这些数据保存下来。

为了将我们的数据进行永久存储,需要引入序列化(pickling/serialization)的概念。

序列化的定义:将复杂的python数据结果转换成一个二进制数据集合(数据流)。反序列化:从数据流(字符串形式)重新构造复杂的python数据结构。

序列化的好处:我们可以通过网络或本地存储介质讲这些数据流保存或传输。

序列化的方法:引入json、pickling、marshal、shelve,其中最常用的是json。

二、JSON标准库

2.1 基本用法 json模块的序列化和反序列化方法分别是dumps和loads,json.dumps()和json.dump()将一个python对象转换成json串,json.loads()和json.load()将一个json串还原成python对象。

json.dump()和json.dumps()的区别

json.dump()处理的是文件对象,而json.dumps()处理的是字符串对象。

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

91

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

51

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

161

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

131

2

3

4

5

6

7

8

9

10

11

12

13

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

pythonjsondictobject

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

21

2

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

JSONPythonobjectdict

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

241

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

151

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

181

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

四、多个JSON字串同时解析

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值