4-05python语法基础-内置模块-json模块

###

序列化是什么?

现在的序列化都是转向一个字符串数据类型,
我们说的序列就是字符串,

为什么要千方百计的转换成为字符串呢?----是为了存储和传递

如果一个字典{"k":"v"}为什么要转成字符串

1,我往文件或者数据库里面写内容的时候是不能写入字典的,可以写入字符串,
2,还有在网络上传输的时候,我需要传递的是byte类型,怎么把字典转换成为一个byte类型呢,
就要先转换为字符串,然后字符串转换为byte类型,
基本就是这两种情况,需要序列化,

这种从数据类型转为字符串,就是序列换,
把字符串转换为数据类型的操作,就是反序列化,

####

json就是python里面的一个内置模块,用来做序列化的,

json模块---dumps序列化操作--把字段转换成字符串

import json

dict1 = {"name":"value","age":11}

print(type(dict1))  # <class 'dict'>
print(type(json.dumps(dict1)))  # <class 'str'>

###

记住这个序列化之后是一个,{'name': 'andy', 'age': 11}

里面是变为单引号了,

####

json模块---loads反序列化操作--把字段转换成字符串

###

import json

jsonData = '{"name":"andy","age":11}'
# jsonData = "{'name':'andy','age':11}"  # 这种不行,必须要有两个引号才行,

text = json.loads(jsonData)
print(type(jsonData),"-----",jsonData)  # <class 'str'> ----- {"name":"andy","age":11}
print(type(text),"-----",text)  # <class 'dict'> ----- {'name': 'andy', 'age': 11}
text_str = json.dumps(text)
print(type(text_str),"-----",text_str)  # <class 'str'> ----- {"name": "andy", "age": 11}
text_dict = json.loads(text_str)
print(type(text_dict),"-----",text_dict)  # <class 'str'> ----- {"name": "andy", "age": 11}

###

在 python3 里,一个json是一个字典,形如 {"a":15}

json转换成字符串的话

那么,如果你要将它转换成字符串,也许你用的是str({"a":15}),这样转出来的,可能是是s= "{'a':'15'}",也就是说,里面的kv是单引号的。这个字符串,传到其他地方,再用json.loads(s)的时候会出错,json不支持单引号。

所以,假如你想把一个json结构,转成字符串,传递给远处,然后再重新解析成json结构,应该这样:

s = json.dumps({"a":15})

然后,把数据传到远端,然后再解析回来:

d = json.loads(s)

这样就不会出错了。

也支持列表,能一次性传多个结构

s = json.dumps([{"a":15}, {"b":20}])

然后,把数据传到远端,然后再解析回来:

d = json.loads(s)

所以一定要注意这个单引号和双引号的问题,

###

上面讲了dumps和loads,还有dump,和load两个方法,这两个基本没有用过,

 dump和dumps的区别:

dump是将对象序列化并保存到文件中
dumps是将对象序列化

load和loads的区别:

load将序列化字符串从文件读取并反序列化
loads将序列化字符串反序列化

####

一些特殊的报错

python报错json.decoder.JSONDecodeError: Invalid control character at: line 1 column 74453 (char 74452)

通过 python 的 json.loads(data) 方法报错时,加上 "strict=False" 即可,如

data = json.loads(data, strict=False)

###

import json
# str1 = ''.format(num_dict)
print(num_dict)
print(json.dumps(num_dict))  -把单引号变成双引号
str1 = json.dumps(num_dict)
# print(json.loads(str1))


####

原文地址:https://www.cnblogs.com/andy0816/p/15253608.html