1. 程式人生 > 程式設計 >python Yaml、Json、Dict之間的轉化

python Yaml、Json、Dict之間的轉化

Json To Dict

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,"e":5}
<class 'str'>
{'a': 1,'b': 2,'c': 3,'d': 4,'e': 5}
<class 'dict'>

Dict To Json

import json
textDict = {"a":1,"e":5}
print(textDict)
print(type(textDict))
# 字典轉化為json
textJson = json.dumps(textDict)
print(textJson)
print(type(textJson))

########################

{'a': 1,'e': 5}
<class 'dict'>
{"a": 1,"b": 2,"c": 3,"d": 4,"e": 5}
<class 'str'>

Dict To 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 To Yaml

Json -> Dict -> Yaml

import json,yaml

jsonData = '{"listDict":{"a":1,"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,"e":5}}
<class 'str'>
{'listDict': {'a': 1,'e': 5}}
<class 'dict'>
listDict:
 a: 1
 b: 2
 c: 3
 d: 4
 e: 5

<class 'str'>

Yaml -> Dict

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 -> dict 需要注意

yaml 5.1版本後棄用了yaml.load(file)這個用法,因為覺得很不安全,5.1版本之後就修改了需要指定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','namespace': 'kube-system'}]}
<class 'dict'>

1、警告提示

YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated,as the default
Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.

2.主要原因

yaml 5.1版本後棄用了yaml.load(file)這個用法,因為覺得很不安全,5.1版本之後就修改了需要指定Loader,通過預設載入​​器(FullLoader)禁止執行任意函式

3.解決方法

1.yaml.load(f,Loader=yaml.FullLoader)

2.yaml.warnings({'YAMLLoadWarning': False}) # 全域性設定警告,不推薦

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的資料請關注我們其它相關文章!