dump介绍


1 json  

.作用:将python内置类型序列化为json对象后写入文件

.参数:要存储的数据以及可以用于存储的文件对象

json.dump(number,file_object)

.样例:把列表数据number储存为json文件

import json

number = [1,2,3,4]

file_name = 'number.json'  
with open(file_name,'w') as file_object:

    json.dump(number,file_object)

   

注意

这里file_object传递的是一个指针

dumps

作用

将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串)

参数

json.dumps(dict)

样例

将name列表转为json对象

import json

number = [1,2,3,4]

number_json =json.dumps(number)

print(number_json)

print(type(number_json))

print(type(number))

结果

[1, 2, 3, 4]

<class 'str'>

<class 'list'>

load


作用

将字符形式的json数据转为python类型

用于从json文件中读取数据

常用的有转化网页请求之后的数据和直接读取文件

参数

json.load(object)注意在读取文件是,object也是一个指针

样例

读取网页请求结果,在另一篇文章关于urllib.request和json入门级别理解中有提到,这里不赘述。

给一个读取文件的例子

这里有个number.json文件,我对里面的内容进行改变,然后分析不同的结果

1、文件内容为:[1,2,3,4]


import json

print(json.load(open("number.json")))

print(type(json.load(open("number.json"))))


注意,一定是参数一定是open(),而不直接是文件名


[1, 2, 3, 4]

<class 'list'>


2、文件内容为:s=[1,2,3,4]

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

       

3、文件内容为:

{"name": "zs", "age": 18}

{'name': 'zs', 'age': 18}

<class 'dict'>

自动识别类似字典类型,因此转为字典,并且双引号都别为了单引号


4、文件内容为:

{'name': 'zs', 'age': 18}

报错

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

总结

说明了在用json.load()方法时,它会自动对原数据进行分析,由于json只能由python基本数据类型转变而成,所以如果原数据形式不符合python基本数据类型的样式,那么将不会转换成功。



loads


作用

把Json格式字符串解码转换成Python对象

参数

参数是数据内容,基本的数据类型的对象本身

还是从json.load()说起

import json

from urllib  import request

url ='http://httpbin.org/ip'

resp = request.urlopen(url)

print(type(resp))

print(json.load(resp))

结果


<class 'http.client.HTTPResponse'>

{'origin': '113.57.182.250'}

即json.load()处理的是包含数据内容的数据文件对象

但是json.loads()处理的是数据对象本身

我们耐心点,对一个一个数据进行分析


1.如果我们对resp请求结果直接用json.loads()方法,而不是用json.load()

import json

from urllib  import request

url ='http://httpbin.org/ip'

resp = request.urlopen(url)

print(type(resp))

print(json.loads(resp))

很显然会报错,因为resp不是可以基本的python数据类型


TypeError: the JSON object must be str, bytes or bytearray, not HTTPResponse

<class 'http.client.HTTPResponse'>

2.如果我们对resp.read()即文本内容来用json.loads()方法呢?

import json

from urllib  import request

url ='http://httpbin.org/ip'

resp = request.urlopen(url)

print(type(resp))

print(json.loads(resp.read()))

那么会得到标准的结果,因为resp.read()是标准符合json样式的字符串


<class 'http.client.HTTPResponse'>

{'origin': '113.57.182.250'}

这里用json.loads()对bytes类型的resp.read()也能转换成功

但是这里出现了一个有意思的问题


import json

from urllib  import request

url ='http://httpbin.org/ip'

resp = request.urlopen(url)

print(type(resp))

print(resp.read())

print(json.loads(resp.read()))

如果你在print(json.loads(resp.read())),有调用过resp.read(),那么再调用json.loads(resp.read())会出错


json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

这是什么原因我也不是很清楚,毕竟刚接触而已,了解不深。

但是如果用变量的方法,可以避免这个问题


import json

from urllib  import request

url ='http://httpbin.org/ip'

resp = request.urlopen(url)

xx =resp.read()

print(type(resp))

print(type(xx))

print(xx)

print(json.loads(xx))

结果


<class 'http.client.HTTPResponse'>

<class 'bytes'>

b'{\n  "origin": "113.57.182.250"\n}\n'

{'origin': '113.57.182.250'}

这是最完美的结果


总结


五、总结 json是用于python基本数据类型和json数据之间相互转换,关键在于数据内容一定要符合python基本数据类型的样式。 其中dumps()和loads()是直接处理基本类型数据本身,没有打开的过程。 dump()和load()是通过打开有基本类型数据的载体,然后再处理转换。 用词不是很专业哈,毕竟是一个小白。 希望能让大家都明白,祝大家学习愉快!