import json
data = {
'name': 'ACME',
'shares': 100,
'price': 542.23
}
1、将Python数据结构转换为JSON
json_str = json.dumps(data)
print(json_str) # {"name": "ACME", "shares": 100, "price": 542.23}
2、将JSON编码的字符串再转回python数据结构
data_rollback = json.loads(json_str)
print(data_rollback) # {'price': 542.23, 'shares': 100, 'name': 'ACME'}
3、如果是同文件而不是字符串打交道的话,可以选择json.dump()和json.load()来编码和解码数据
with open('data.json', 'w') as f:
json.dump(data, f)
with open('data.json', 'r') as f:
data_f = json.load(f)
print(data_f) # {'name': 'ACME', 'price': 542.23, 'shares': 100}
JSON编码支持的基本类型有None、bool、int、float和str,当然也包括这些基本类型的列表、元组以及字典。对于字典,JSON会假设键(key)是字符串。要符合JSON规范,应该只对python列表和字典进行编码。
JSON编码的格式几乎与Python语法一致,只有几个地方稍有不同
d = {
'a': True, # -->true
'b': False, # -->false
'c': None # -->null
}
print(json.dumps(d)) # {"a": true, "c": null, "b": false}
4、对于由JSON解码过来的,包含了深层次的嵌套结构,可以考虑使用pprint模块的pprint()函数,该函数会把输出按照一定的格式美化。
5、自定义JSON对象转换类型
json.loads默认将JSON中的对象数据转化为Dictionary类型, object_hook参数可以用来改变构造出的对象.
object_hook接受一个函数, 这个函数的输入参数为JSON中对象数据转化出的Dictionary对象, 其返回值则为自定义object_pairs_hook参数. 这个参数同样可以用来改变json.loads方法构造出的Python对象的类型. 这个参数和object_hook的不同, 在于传入的方法所接收到的输入数据不是一个Dictionary, 而是一个包含tuple的list. 每个tuple都有两个元素, 第一个元素是JSON数据中的键, 第二个元素是这个键对应的值
s = '{"name": "ACME", "shares": 50, "price": 490.1}'
data = json.loads(s, object_pairs_hook=OrderedDict)
print(data) # OrderedDict([('name', 'ACME'), ('shares', 50), ('price', 490.1)])
6、json.dumps()常用参数解释
indent:应该是一个非负的整型,如果是0,或者为空,则一行显示数据;否则会换行且按照indent的数量显示前面的空白
sort_keys:将数据根据keys的值进行排序
print(json.dumps(data, indent=4)) # 输出如下:
{
"name": "ACME",
"price": 542.23,
"shares": 100
}
print(json.dumps(data, sort_keys=True)) # {"name": "ACME", "price": 542.23, "shares": 100}