用了很久的json,但是却没有完整地总结过。现通过这篇文章稍微整理一下
每个编程语言都会涉及到对json相关操作,之后都将记录在这篇博客中
一、JSON定义
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换语言,用来传输由属性值或者序列性的值组成的数据对象。
尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式。很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json
,文件扩展名是 .json
。
二、JSON 语法规则
- 使用
key: value
表示数据 - 数据由
,
分隔 {}
保存对象[]
保存数组
json的key
只能取string
,value
可取的类型有:
- string:字符串
- number:数字
- boolean:true/false
- null:空
- array:
[]
- Object:
{}
例:
{
"key1": "value1",
"key2": ["value2", "value3"],
"key3": {"key31": "value31", "key32": "value32"}
}
2.1.畸形JSON
畸形JSON指的是不符合JSON语法规则的表达方式,如:
- 使用单引号:
{"key": 'value'}
- key为非字符串类型:
{key: "value"}
2.2.JSON检测工具:
有时候我们可能得到一行很长的json数据,不便于阅读。有许多工具可以帮助我们检测json数据是否合法,并使之更加清晰易读。
shell:使用python json
模块或者jq
工具
text='{ "key1": "value1", "key2": ["value2", "value3"]}'
echo $text | python -m json.tool
{
"key1": "value1",
"key2": [
"value2",
"value3"
]
}
# Centos/Ubuntu/Macos
yum/apt-get/brew install jq
echo '{ "key1": "value1", "key2": ["value2", "value3"]}' | jq
{
"key1": "value1",
"key2": [
"value2",
"value3"
]
}
python
import json
# json.dumps 用于将 Python 对象转换成 JSON 字符串
json.dumps({"key": "value"}) --> type = str
print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
"4": 5,
"6": 7
}
# json.loads 用于解析 JSON 数据,使之成为 Python 数据类型
json.loads('{"key": "value"}') --> type = dict
python对象类型转换为json数据类型对照表:
python | json |
---|---|
dict | object |
tuple, list | array |
str | string |
int, float, int- & float-derived Enums | number |
True/False | true/false |
None | null |
JSON数据类型转换为python对象类型对照表:
json | python |
---|---|
object | dict |
array | list |
string | str |
number(int) | int |
number(float) | float |
true/false | True/False |
null | None |
js
// 将JSON字符串转换为js对象
JSON.parse('{"key": value}')
// 将js对象转换为JSON字符串
JSON.stringify(obj);
三、Yaml to Json
yaml是json的超集,通常用于配置文件,阅读性更好
可以使用yq
(pip install yq)将yaml转换为json
cat config.yaml | yq
如果一个yaml文件很长,可以将其转换为json,然后获取感兴趣的字段
比如需要查看一个k8s的deployment中定义的pod内有哪些容器
kubectl get deployment my-deployment -o yaml | yq .spec.template.spec.containers[].image