读写JSON数据

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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值