Python中YAML、JSON与字典互转及Loader安全配置详解
本文详细介绍Python中JSON字符串与字典、字典与YAML字符串之间的相互转换方法。重点解析PyYAML 5.1版本后yaml.load()弃用原因及FullLoader安全加载器的使用,提供BaseLoader、SafeLoader等加载方式对比,确保数据解析安全性。
JSON与字典互转
将JSON字符串转换为Python字典对象。
import json
jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
print(jsonData)
print(type(jsonData))
text = json.loads(jsonData)
print(text)
print(type(text))
#######################
{"a":1,"b":2,"c":3,"d":4,"e":5}
<class 'str'>
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
<class 'dict'>
将Python字典对象转换为JSON字符串。
import json
textDict = {"a":1,"b":2,"c":3,"d":4,"e":5}
print(textDict)
print(type(textDict))
# 字典转化为json
textJson = json.dumps(textDict)
print(textJson)
print(type(textJson))
########################
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
<class 'dict'>
{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
<class 'str'>
字典与YAML互转
将Python字典对象转换为YAML字符串。
import yaml
dictText = {
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "ClusterRoleBinding",
"metadata": {
"name": "admin-user"
},
"roleRef": {
"apiGroup": "rbac.authorization.k8s.io",
"kind": "ClusterRole",
"name": "cluster-admin"
},
"subjects": [
{
"kind": "ServiceAccount",
"name": "admin-user",
"namespace": "kube-system"
}
]
}
print(type(dictText))
yamlText = yaml.dump(dictText)
print(yamlText)
print(type(yamlText))
#############################3
<class 'dict'>
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
<class 'str'>
JSON到YAML的转换
将JSON字符串转换为YAML字符串。
通过中间字典实现JSON到YAML的转换流程。
import json,yaml
jsonData = '{"listDict":{"a":1,"b":2,"c":3,"d":4,"e":5}}';
print(jsonData)
print(type(jsonData))
# Json -> Dict
text = json.loads(jsonData)
print(text)
print(type(text))
# Dict -> Yaml
textYaml = yaml.dump(text)
print(textYaml)
print(type(textYaml))
#############################
{"listDict":{"a":1,"b":2,"c":3,"d":4,"e":5}}
<class 'str'>
{'listDict': {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}}
<class 'dict'>
listDict:
a: 1
b: 2
c: 3
d: 4
e: 5
<class 'str'>
将YAML字符串解析为Python字典对象。
import yaml
yamlText ='''
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system'''
print(yamlText)
print(type(yamlText))
# Yaml -> Dict
dictText = yaml.load(yamlText,Loader=yaml.FullLoader)
print(dictText)
print(type(dictText))
#############################
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
<class 'str'>
{'apiVersion': 'rbac.authorization.k8s.io/v1', 'kind': 'ClusterRoleBinding', 'metadata': {'name': 'admin-user'}, 'roleRef': {'apiGroup': 'rbac.authorization.k8s.io', 'kind': 'ClusterRole', 'name': 'cluster-admin'}, 'subjects': [{'kind': 'ServiceAccount', 'name': 'admin-user', 'namespace': 'kube-system'}]}
<class 'dict'>
YAML加载安全与Loader配置
在使用yaml.load()进行YAML到字典转换时,需特别注意版本兼容性与安全性配置。
自PyYAML 5.1版本起,官方弃用了直接调用yaml.load(file)的做法,原因是其存在安全风险。新版本要求必须显式指定Loader参数,默认加载器FullLoader会禁止执行任意函数,从而防止潜在的安全漏洞。
import yaml
yamlText ='''
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system'''
print(yamlText)
print(type(yamlText))
# yaml -> dict 没有设置 ,Loader=yaml.FullLoader 执行后如下含有警告
dictText = yaml.load(yamlText)
print(dictText)
print(type(dictText))
#########################
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
<class 'str'>
/Users/yyj/Desktop/Project/HelloBike/TimeCalc/pydict2json/dict2json.py:88: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
dictText = yaml.load(yamlText)
{'apiVersion': 'rbac.authorization.k8s.io/v1', 'kind': 'ClusterRoleBinding', 'metadata': {'name': 'admin-user'}, 'roleRef': {'apiGroup': 'rbac.authorization.k8s.io', 'kind': 'ClusterRole', 'name': 'cluster-admin'}, 'subjects': [{'kind': 'ServiceAccount', 'name': 'admin-user', 'namespace': 'kube-system'}]}
<class 'dict'>
当未正确配置Loader时,程序运行会输出警告提示。
YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
该警告产生的核心原因在于安全性考量。
PyYAML 5.1版本之后,为了消除安全隐患,修改了默认行为,强制要求用户指定Loader参数。默认的FullLoader通过禁止执行任意函数来保障加载过程的安全。
解决该警告及确保安全的推荐方法如下。
推荐做法:在调用yaml.load()时显式指定Loader参数,例如使用yaml.load(f, Loader=yaml.FullLoader)。
不推荐做法:通过yaml.warnings({'YAMLLoadWarning': False})全局关闭警告。这种方法虽然能消除提示,但忽略了潜在的安全风险,不建议在生产环境中使用。
PyYAML提供了多种Loader加载方式,以适应不同场景。
- BaseLoader:仅加载最基本的YAML语法结构,功能受限。
- SafeLoader:安全地加载YAML语言的子集,专门设计用于处理不受信任的输入数据,是推荐的安全加载方式。
- FullLoader:加载完整的YAML语言规范,同时避免执行任意代码。这是当前PyYAML 5.1版本中调用yaml.load(input)时的默认加载器(尽管会发出弃用警告)。
- UnsafeLoader:也称为Loader(向后兼容模式),保留了原始Loader的行为,允许通过不受信任的数据输入执行任意代码,存在极高安全风险,应避免使用。
至此,Yaml 、Json 、Dict 之间的转化 介绍完了
以上就是python Yaml 、Json 、Dict 之间的转化的详细内容,更多关于python Yaml 、Json 、Dict的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









