Python中json模块的dumps()和loads()

一、JSON是什么?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,是JavaScript的子集,易于人类阅读和编写。

JSON建构于两种结构:json是Javascript中的对象和数组中的对象,本质上来讲就是有特定结构的字符串,所以可以通过这两种结构可以表示各种复杂的结构:

1 对象: 对象在js中表示为”{}”括起来的内容,数据结构为{key:value, key:value…}的键值对结构,在面向对象的语言中,key为对象的属性,value为对应属性的值,所以很容易去理解。属性值value可以为:数字、字符串、数组、对象等。
2 数组:数组在js中是中括号“[]”括起来的内容,数据结构为[“java”, “javascript”, “vb”….] 取值方式和所有语言一样,使用索引获取,字段值的类型是:数字、字符串、数组、对象等

简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比”名称 / 值对”更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
按照最简单的形式,可以用下面这样的 JSON 表示 “名称 / 值对” :{ “firstName”: “Brett” }
当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。

如:

     {undefined

        "people":[

         {"firstName": "111", ....},

         {"firstName": "222",...},

         {"firstName": "333",...}

     ]}

需要注意的是JSON中
1.名称必须加双引号
2.值可以是加双引号的字符串、数字、bool型、null、数组、或者对象

二、python数据类型与json数据类性的映射关系

PythonJSON
dictobject
list,tuplearray
str,unicodestring
int,long,floatnumber
Truetrue
Falsefalse
Nonenull

三、dumps()、loads()、dump()、load()

方法描述
json.dumps()将python对象编码成json字符串
json.loads()将已编码的json字符串解码成python对象
json.dump()将python内置类型序列化为json对象后写入文件
json.load()读取文件中json形式的字符串转化为python类型

dumps()和loads()

举个例子:

# encoding: utf-8
import json
data = {'name': '中文', 'sex': 'male', '年龄': 26}
# 将python字典对象编码成json字符串
json_str = json.dumps(data)
print(json_str)
print(type(json_str))
# 将json字符串解码为python字典对象
data1 = json.loads(json_str)
print(data1)
print(type(data1))
D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
{"name": "\u4e2d\u6587", "sex": "male", "\u5e74\u9f84": 26}
<class 'str'>
{'name': '中文', 'sex': 'male', '年龄': 26}
<class 'dict'>

Process finished with exit code 0

上面可以看到,在json中,使用的都是双引号

再举个元组和列表的例子:

# encoding: utf-8
import json
data = (1, 2, 3, 4)
data_json = [1, 2, 3, 4]
# 将python对象编码成json字符串
print(json.dumps(data))
print(json.dumps(data_json))
# 将json字符串解码成python对象
a = json.dumps(data)
b = json.dumps(data_json)
print(json.loads(a))
print(json.loads(b))
D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]

Process finished with exit code 0

元组和列表解析出来都是数组

dump()和load()

# encoding: utf-8
import json
data = {
    'name': '中文',
    'a': [1, 2, 3, 4],
    'b': (1, 2, 3)
}
with open('json_test.txt', 'w+') as f:
    json.dump(data, f)

with open('json_test.txt', 'r+') as f:
    print(json.load(f))
D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
{'name': '中文', 'a': [1, 2, 3, 4], 'b': [1, 2, 3]}

Process finished with exit code 0

四、参数解释

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):
# obj: 表示是要序列化的对象

# fp: 文件描述符,将序列化的str保存到文件中。json模块总是生成str对象,而不是字节对象;因此,fp.write()必须支持str输入

# skipkeys:布尔型,默认为False,如果设为True的话,在dict中的key值如果出现非 (str, unicode, int, long, float, bool, None)对象,则跳过该key而不是抛出ValueError

# ensure_ascii:布尔型,默认为True,如果为true则所以传入的非ASCII字符都被转义,如果为False则字符将被原样输出

# check_circular:默认值为True,如果check_circular为False,则将跳过对容器类型的循环引用检查,循环引用将导致OverflowError

# allow_nan: 默认值为True,如果allow_nan为False,则严格遵守JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError。 如果allow_nan为True,则将使用它们的JavaScript等效项(NaN,Infinity,-Infinity)

# indent: 设置缩进格式,默认值为None,选择的是最紧凑的表示。一般设为4,如果设为0则只会添加换行符。 indent参数根据数据格式缩进显示,读起来更加清晰。

# separators: separators: 去除分隔符后面的空格,默认值为None,如果指定,则分隔符应为(item_separator,key_separator)元组。如果缩进为None,则默认为(’,’,’:’);要获得最紧凑的JSON表示,可以指定(’,’,’:’)以消除空格。

# default: 默认值为None,如果指定,则default应该是为无法以其他方式序列化的对象调用的函数。它应返回对象的JSON可编码版本或引发TypeError。如果未指定,则引发TypeError。

# sort_keys: 布尔型,默认为False,如果是字典对象,选择True的话,会按照键的ASCII码来排序 

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, 
allow_nan=True, cls=None, indent=None, separators=None, default=None, 
sort_keys=False, **kw)

dumps函数不需要传文件描述符,其他的参数和dump函数的一样。

json.load(fp, *, cls=None, object_hook=None, parse_float=None, 
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

# fp: 文件描述符,将fp(.read()支持包含JSON文档的文本文件或二进制文件)反序列化为Python对象

# object_hook: 默认值为None,object_hook是一个可选函数,此功能可用于实现自定义解码器。指定一个函数,该函数负责把反序列化后的基本类型对象转换成自定义类型的对象

# parse_float: 默认值为None,如果指定了parse_float,用来对JSON float字符串进行解码,这可用于为JSON浮点数使用另一种数据类型或解析器

# parse_int: 默认值为None,如果指定了parse_int,用来对JSON int字符串进行解码,这可以用于为JSON整数使用另一种数据类型或解析器

# parse_constant:默认值为None,如果指定了parse_constant,对-Infinity,Infinity,NaN字符串进行调用。如果遇到了无效的JSON符号,会引发异常

# 如果进行反序列化(解码)的数据不是一个有效的JSON文档,将会引发 JSONDecodeError异常
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, 
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

# s: 将s(包含JSON文档的str,bytes或bytearray实例)反序列化为Python对象
# encoding: 指定一个编码的格式

loads也不需要文件描述符,其他参数的含义和load函数的一致。

举个例子:

设置ensure_ascii=False来看看效果

# encoding: utf-8
import json
data = {'name': '中文', 'sex': 'male', '年龄': 26}
# 将python字典对象编码成json字符串
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
print(type(json_str))
# 将json字符串解码为python字典对象
data1 = json.loads(json_str)
print(data1)
print(type(data1))
D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
{"name": "中文", "sex": "male", "年龄": 26}
<class 'str'>
{'name': '中文', 'sex': 'male', '年龄': 26}
<class 'dict'>

Process finished with exit code 0

可以看到,输出编码后的json字符串,非ASCII码不再被转义(没有前缀"u")

五、dump()、dumps()、load()、loads()区别

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

dump():将python对象序列化为json字符串,并保存到文件中

dumps():将python对象序列化为json字符串

2.load()和loads()的区别

load():将序列化的json字符串从文件读取,并反序列化为python对象

loads():将序列化的json字符串反序列化为python对象

简单来说,dump()/load()多了一个与文件相关的参数,能够与文件操作相结合。

即,dump()是先将python文件对象序列化为json字符串后,再保存在文件中

load()是先从文件中读取已序列化的字符串,再解码成python对象。

参考链接:
https://blog.csdn.net/qq_42233538/article/details/86767629
https://blog.csdn.net/weixin_40636692/article/details/81212304
https://blog.csdn.net/whjkm/article/details/81159888

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值