##JSON库
Q1:为什么需要转换为json格式
A1:json.dumps
函数用于将Python对象转换为JSON格式的字符串。尽管在结果上看起来可能没有太大变化,但这个转换的意义在于:
-
数据交换与存储: 将Python对象转换为JSON字符串后,可以方便地进行数据的交换与存储。JSON是一种通用的数据格式,支持多种编程语言,因此可以轻松地在不同系统之间传递数据。
-
与Web API交互: 当与Web API进行交互时,通常需要将请求或响应中的数据以JSON格式进行编码或解码。这样可以确保数据的一致性和可读性,并简化数据的处理流程。
-
前后端交互: 在Web开发中,前端与后端之间的数据交换通常采用JSON格式。前端页面可以通过JavaScript将用户输入的数据转换为JSON格式后发送到后端,后端处理完数据后再将结果以JSON格式返回给前端。
-
配置文件: 有时候将配置信息以JSON格式保存在文件中,以便程序在需要时读取和解析。这样可以更灵活地管理配置,并且JSON格式相对于其他格式更易于人们阅读和理解。
-
日志记录: 有时候程序的日志信息也会以JSON格式记录,这样可以更方便地对日志进行分析和处理。
总之,使用json.dumps
可以将Python对象转换为标准的JSON格式字符串,使得数据在不同系统之间的交互更加方便和高效。
#!Python 3.8.12
#Mu Editor软件
##调用json
##json.dumps语法,参数10个
"""
json.dumps(obj, skipkeys=False, ensure_ascii=True,
check_circular=True, allow_nan=True, cls=None,
indent=None, separators=None,encoding="utf-8",
default=None, sort_keys=False, **kw)
"""
##参数1:obj(对象,一般是列表或字典等数据结构)
import json
data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
data1 = json.dumps(data)
print(data1) #[{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]
print(type(data1)) #<class 'str'>
#参数2:skipkeys(对象中包含不支持JSON格式的键时,是否跳过它们,默认False.对象为字典的时候,
#无论True还是False,字典中包含不可哈希的键,也会引发 TypeError。
#这是因为 JSON 对象的键必须是字符串类型,而不可哈希的键无法转换成字符串。)
#True
_data = {['a', 'b']: 1, 'c': 2}
data2 = json.dumps(_data,skipkeys=True)
print(data2) #TypeError: unhashable type: 'list'
#False
data2 = json.dumps(_data,skipkeys=False)
print(data2) #TypeError: unhashable type: 'list'
##参数3:ensure_ascii,是否所有非 ASCII 字符将会转义成 ASCII
#非 ASCII 字符:
#1.拉丁字母扩展字符:例如带有重音符号、附加符号、特殊字符的字符,如é、ñ、ß等。
#2.非拉丁字母字符:例如中文、日文、韩文、俄文等字符。
#3.符号和特殊字符:例如货币符号、数学符号、箭头、表情符号等"
#默认True
data = [ { 'aé' : 1, 'b' : 2, 'c中文' : 3, 'd' : 4, 'e' : 5 } ]
data3=json.dumps(data,ensure_ascii=True)
print(data3) #[{"a\u00e9": 1, "b": 2, "c\u4e2d\u6587": 3, "d": 4, "e": 5}]
data3=json.dumps(data,ensure_ascii=False)
print(data3) #[{"aé": 1, "b": 2, "c中文": 3, "d": 4, "e": 5}]
##参数4:check_circular 参数用于控制是否检测对象之间的循环引用。(没弄懂!!!)
#循环引用指的是一个对象包含对自身的引用,或者多个对象之间相互引用形成闭环。
#例子略。
##参数5:allow_nan:是否允许编码过程中包含 NaN、Infinity 和 -Infinity
#默认值:True,如果设置为 False,则存在 NaN、Infinity 和 -Infinity,会引发 ValueError。
#例子1
#True,允许特殊的浮点数值出现在 JSON 字符串中
data=[{'a':'NaN','NaN':1}] #例子中,其实并没有真正的NaN
import json
data5=json.dumps(data,allow_nan=True)
print(data5) #[{"a": "NaN", "NaN": 1}]
#False,不允许特殊的浮点数值出现在 JSON 字符串中
data5=json.dumps(data,allow_nan=False)
print(data5) #[{"a": "NaN", "NaN": 1}]
#例子2
import math
data = [{'a': math.nan, 'NaN': 1}]
# allow_nan=True
data5 = json.dumps(data, allow_nan=True)
print(data5) # [{"a": "NaN", "NaN": 1}]
# allow_nan=False,会引发异常
try:
data5 = json.dumps(data, allow_nan=False)
print(data5) #Out of range float values are not JSON compliant
except ValueError as e:
print("Error:", e)
##参数6:cls 用于自定义 JSON 编码过程的编码器类。默认为 None,表示使用内置的 JSONEncoder。
##参数7:indent 用于指定输出 JSON 字符串的缩进空格数,以使其更易读。
#如果设置为 None(默认值),则表示不进行缩进。
import json
data=[ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
#None
data7=json.dumps(data,indent=None)
print(data7) #[{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]
#字符串:'@'
data7=json.dumps(data,indent='@')
print(data7)
"""结果:
[
@{
@@"a": 1,
@@"b": 2,
@@"c": 3,
@@"d": 4,
@@"e": 5
@}
]
"""
#数值:2
data7=json.dumps(data,indent=2)
print(data7)
"""结果:
[
{
"a": 1,
"b": 2,
"c": 3,
"d": 4,
"e": 5
}
]
"""
print(type(data7)) #<class 'str'>
##参数8:separators 用于指定 JSON 字符串中键值对之间的分隔符。默认为 (', ', ': ')。
import json
data=[ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
data8=json.dumps(data,separators=("中文\n",": "))
print(data8)
"""结果:
[{"a": 1中文
"b": 2中文
"c": 3中文
"d": 4中文
"e": 5}]
"""
##参数8:encoding="utf-8",一个字符串,表示用于编码 JSON 字符串的字符编码。默认为 "utf-8"。
encoding="utf-8",
##参数9:default=None 一个函数,用于在编码期间处理不支持 JSON 格式的对象。默认为 None。
##参数10:sort_keys
#设置为 True,则表示输出的 JSON 对象的键按字母顺序排序。
#默认为 False。
import json
data=[ { 'a' : 1, 'c' : 2, 'f' : 3, 'd' : 4, 'e' : 5 } ]
#False,默认值
data10=json.dumps(data,sort_keys=False)
print(data10) #[{"a": 1, "c": 2, "f": 3, "d": 4, "e": 5}]
#True,按字母顺序
data10=json.dumps(data,sort_keys=True)
print(data10) #[{"a": 1, "c": 2, "d": 4, "e": 5, "f": 3}]
如果你真的想当程序员那么就先写一万条代码。……《向上生长》
18号复习写下49条代码
目标:10000条
剩余:9534条
总结:
Json新接触,参数之多,没有什么手头上的应用,感觉很难去理解这个。不过想起《向上生长》中说的,“ “学习的能力”有两重意思,一是不惧怕学习新东西,二是知道学习曲线,能够顺利抗过学习新知识初期的挫折感。”继续前进学习,一步一个脚印。不知不觉完成了5%的进度了呢。