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,"b":2,"c":3,"d":4,"e":5}

<class 'str'>

{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

<class 'dict'>

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

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,"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 -> 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', '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'>

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之间的转化 的全部内容, 来源链接: utcz.com/z/327828.html

回到顶部