首页 > 其他分享 >序列化模块JSON

序列化模块JSON

时间:2023-06-05 09:46:08浏览次数:48  
标签:模块 json dic JSON str dic2 序列化 字典

序列化模块

什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化

【一】为什么要有序列化模块

  • 比如,我们在 python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?

    • 现在我们能想到的方法就是存在文件里
    • 然后另一个 python 程序再从文件里读出来。
  • 但是我们都知道

    • 对于文件来说是没有字典这个概念的
    • 所以我们只能将数据转换成字典放到文件中。
  • 你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了

    • 为什么我们还要学习序列化模块呢?
  • 没错序列化的过程就是从dic 变成str(dic)的过程。

  • 现在你可以通过str(dic)

    • 将一个名为dic的字典转换成一个字符串,
  • 但是你要怎么把一个字符串转换成字典呢?

    • 聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。
    • eval()函数十分强大
      • 但是eval是做什么的?
      • e官方demo解释为:
        • 将字符串str当成有效的表达式来求值并返回计算结果。
      • BUT!强大的函数有代价。安全性是其最大的缺点。
  • 想象一下

    • 如果我们从文件中读出的不是一个数据结构,
    • 而是一句"删除文件"类似的破坏性语句
    • 那么后果实在不堪设设想。
      而使用eval就要担这个风险。
  • 所以

    • 我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)

【二】序列化的目的

  • 1、以某种存储形式使自定义对象持久化
  • 2、将对象从一个地方传递到另一个地方。
  • 3、使程序更具维护性。

1

【三】序列化模块之JSON

导入模块

import json
  • Json 模块提供了四个功能:
    • dumps
    • dump
    • loads
    • load

【1】loads和dumps

  • 序列化
    • 将一个字典转换成一个字符串
import json

dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
str_dic = json.dumps(dic)  
print(type(str_dic), str_dic)  
# <class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}

注意

​ json转换完的字符串类型的字典中的字符串是由 "" 表示的

  • 反序列化
    • 将一个字符串格式的字典转换成一个字典
import json

dic2 = json.loads(str_dic)  
print(type(dic2),dic2)  
#<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

注意

​ 要用 jsonloads 功能处理的字符串类型的字典中的字符串必须由 "" 表示

  • 也可以处理嵌套的数据类型
import json

list_dic = [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
str_dic = json.dumps(list_dic)
print(type(str_dic), str_dic)
# <class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
import json

list_dic = [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
str_dic = json.dumps(list_dic)
list_dic2 = json.loads(str_dic)
print(type(list_dic2), list_dic2)
# <class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]

【2】load和dump

  • dump方法
    • 接收一个文件句柄
    • 直接将字典 转换成 json字符串 写入文件
import json
f = open('json_file','w')
dic = {'k1':'v1','k2':'v2','k3':'v3'}
json.dump(dic,f)
f.close()
  • load方法
    • 接收一个文件句柄
    • 直接将文件中的 json字符串 转换成 数据结构返回
f = open('json_file')
dic2 = json.load(f)  
f.close()
print(type(dic2),dic2)

【四】ensure_ascii关键字参数

import json

f = open('file', 'w')
json.dump({'国籍': '中国'}, f)
ret = json.dumps({'国籍': '中国'})
f.write(ret + '\n')
json.dump({'国籍': '美国'}, f, ensure_ascii=False)
ret = json.dumps({'国籍': '美国'}, ensure_ascii=False)
f.write(ret + '\n')
f.close()

【五】其它参数说明

Serialize obj to a JSON formatted str.(字符串表示的json对象) 

Skipkeys:
	默认值是False
    	如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None)设置为False时,就会报TypeError的错误。
    	此时设置成True,则会跳过这类key 

ensure_ascii:
    当它为True的时候
    	所有非ASCII码字符显示为\uXXXX序列
        只需在dump时将ensure_ascii设置为False即可
        此时存入json的中文即可正常显示。

If check_circular is false, then the circular reference check for container types will be skipped and a circular reference will result in an OverflowError (or worse). 
If allow_nan is false, then it will be a ValueError to serialize out of range float values (nan, inf, -inf) in strict compliance of the JSON specification, instead of using the JavaScript equivalents (NaN, Infinity, -Infinity). 

indent:
	应该是一个非负的整型
    	如果是0就是顶格分行显示
        如果为空就是一行最紧凑显示
        否则会换行且按照indent的数值显示前面的空白分行显示
    这样打印出来的json数据也叫pretty-printed json 

separators:
	分隔符
    	实际上是(item_separator, dict_separator)的一个元组
        默认的就是(‘,’,’:’);
        	这表示dictionary内keys之间用“,”隔开
            而KEY和value之间用“:”隔开。 

            
default(obj) is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError. 

sort_keys:
	将数据根据keys的值进行排序。 

To use a custom JSONEncoder subclass (e.g. one that overrides the .default() method to serialize additional types), specify it with the cls kwarg; otherwise JSONEncoder is used.

【六】json 的格式化输出

import json

data = {'username': ['李华', '二愣子'], 'sex': 'male', 'age': 16}
json_dic2 = json.dumps(data, sort_keys=True, indent=2, separators=(',', ':'), ensure_ascii=False)
print(json_dic2)

# {
#   "age":16,
#   "sex":"male",
#   "username":[
#     "李华",
#     "二愣子"
#   ]
# }

标签:模块,json,dic,JSON,str,dic2,序列化,字典
From: https://www.cnblogs.com/dream-ze/p/17457034.html

相关文章

  • random模块生成六位随机数字+大小写验证码
    random模块生成六位随机数字+大小写验证码【一】代码importrandom'''生成六位随机(数字+大小写)验证码'''defget_verify_code(n):code=''foriinrange(n):random_int=str(random.randint(0,9))#0-9之间的整数random_upper......
  • hashlib模块
    hashlib模块【一】算法介绍Python的hashlib提供了常见的摘要算法如MD5SHA1等等。什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。摘要算法就是通过摘要函数f()对任意长......
  • 补充:通过Python中的subprocess模块实现安装pip模块
    通过Python代码实现安装pip模块或更新可以使用Python的内置模块subprocess来实现安装pip模块,具体步骤如下:【一】导入subprocess模块。importsubprocess【二】执行安装命令。subprocess.call(['python','-m','ensurepip','--upgrade'])在上面的代码中,调用subproce......
  • OverTheWire攻关过程-Bandit模块31
    我们打开lv30-lv31,查看信息机器翻译有一个git仓库在ssh://bandit30-git@localhost/home/bandit30-git/repo经由端口2220。用户bandit30-git的密码与用户bandit30的密码相同。克隆存储库并找到下一级别的密码。您可能需要解决此级别的命令git的一样的使用git命令我们登陆服务器查......
  • requests模块 编码和wireshark测试
    结合wireshark进行测试、分析1、编码问题1.1url路径url路径中包含敏感字符,不会被url编码的字符包括:'=;,!*-会被url编码的字符包括:"<>\\非ascii字符会先进行utf-8编码,再进行url编码。比如字符'时'编码为%E6%97%B61.2直接参数和url具有基本一致的编码和非编码字符,新增......
  • SpringMVC 3使用Fastjson代替Jackson
    [size=large][color=red]Json解析教程(四.FastJson的使用)[/color][/size][url]http://zyjustin9.iteye.com/blog/2020533[/url]1.[代码][Java]代码publicclassUser{privateLongid;privateStringname;publicLonggetId(){retur......
  • SpringMVC 转换ajax的json数据乱码问题
    在springmvc3中,已经集成了Jackson(json处理器)来处理数据输出json格式,spring中封装的类是[color=blue]org.springframework.http.converter.json.MappingJackson2HttpMessageConverter[/color]这个json转换器,如果是[color=red]springmvc3.2[/color]之前的版本,可以使用[color=b......
  • Spring返回json格式数据的三种方式
    SVN多版本库环境的搭建OAuth2.0是什么?看这篇文章就够了。前端JavaPython等资源合集大放送目前前后端分离大行其道,如何进行前后分类是各个项目需要考虑的问题。如何使用Spring进行前后端分离呢?返回json格式数据是前后端分离的最佳选择。下面介绍使用Spring进行前后端分离的常用三......
  • requests模块
    1、介绍requests是python用于处理http/https的一个第三方库,需要pip安装。注意避免安装request模块,这是一个恶意黑客仿照requests定制的模块Pythonrequests模块|菜鸟教程(runoob.com)Requests:HTTPforHumans™—Requests2.31.0documentation2、request函数def......
  • 案例补充:random模块模拟随机验证码登陆验证
    案例补充:random模块模拟随机验证码登陆验证***用到的知识点【一】random模块产生随机数字(1)产生0-9之间的随机整数importrandomrandom_int=str(random.randint(0,9))(2)产生A-Z之间的字母importrandomrandom_upper=chr(random.randint(65,90))(3)产生a-z之间的字......