json序列化:
json的dumps方法可以将json格式数据序列为python的相关数据类型,比如str,常用于打印,另外,在序列化时,中文汉字被转换为unicode编码,在dumps函数中添加参数ensure_ascii=False可解决;dumps的indent参考可以调整显示格式,即缩进,一般设置为2。【字典中键值对,不管是单还是双引号,dumps后,都是双引号】
json反序列化:
json的loads方法可以把python数据类型转换为json相应的数据类型格式,反序列化后可以对json数据进行各种操作;反序列化时,键值数据不能用双引号,只能用单引号(如果是双引号,可以用eval)。
键值对如果是单引号,loads报错:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
import json print('字典'.center(10,'*')) s1 = '{"tom":{"age":18,"sex":"男"},"jack":{"age":19,"sex":"女"}}' s2 = "{'tome':{'age':18,'sex':'男'},'jack':{'age':19,'sex':'女'}}" # 字符串通过json.loads转字典的时候,字符串里面不能为单引号,打印s2会报错 print(json.loads(s1), type(json.loads(s1))) # 用dumps,字典中键值变成双引号 print(json.dumps(json.loads(s1)), type(json.dumps(json.loads(s1)))) print(json.dumps(json.loads(s1),ensure_ascii=False), type(json.dumps(json.loads(s1),ensure_ascii=False))) print(json.dumps(json.loads(s1),ensure_ascii=False,indent=2)) # 用str,字典中键值依旧是单引号 print(str(json.loads(s1)), type(str(json.loads(s1)))) # print(json.loads(s2)) # 报错 # 但是,可以通过eval将s2转换为字典 print(eval(s2), type(eval(s2))) # dumps会将中文转换成unicode编码,加参数ensure_ascii=False解决 print(json.dumps(eval(s2)), type(json.dumps(eval(s2)))) print(json.dumps(eval(s2),ensure_ascii=False), type(json.dumps(eval(s2),ensure_ascii=False))) print('字符串--列表'.center(10,'*')) la = '[1,2,3,4]' lb = "[1,2,3,4]" print(eval(la), type(eval(la))) print(json.loads(la), type(json.loads(la))) # 字符串转列表[1, 2, 3, 4] <class 'list'> print(json.dumps(json.loads(la)),type(json.dumps(json.loads(la)))) # 列表转字符串,[1, 2, 3, 4] <class 'str'> print(eval(lb), type(eval(lb))) print(json.loads(lb), type(json.loads(lb))) # 字符串转列表[1, 2, 3, 4] <class 'list'> print(json.dumps(json.loads(lb)),type(json.dumps(json.loads(lb)))) # 列表转字符串,[1, 2, 3, 4] <class 'str'> print('列表--字符串'.center(10,'*')) user_list = ['tom', 'jack'] user_list2 = ["tom", "jack"] print(type(json.dumps(user_list)), json.dumps(user_list)) # 列表转字符串 <class 'str'> ["alex", "jason"] print(type(json.dumps(user_list2)), json.dumps(user_list2)) print(type(json.dumps(user_list2)), str(user_list2)) # 双引号变单引号 print('导入、导出'.center(10,'*')) dic = {'k1': 1, 'k2': 2} json.dump(dic, open('db', 'w')) # 将字典序列化导入文件,写入字符串 r = json.load(open('db', 'r')) # 反序列化从文件中导出 print(r, type(r)) # {'k1': 1, 'k2': 2} <class 'dict'>