python-json

json

对数据进行序列化和反序列化是常见的数据操作,Python提供了两个模块方便开发者实现数据的序列化操作,即 json 模块和 pickle 模块

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式

  • JSON注意事项:
  • (1)名称必须用双引号(即:" ")来包括
  • (2)值可以是双引号包括的字符串、数字、true、false、null、JavaScript数组,或子对象。
import json

# json的四个函数
json.dumps()        # 将 Python 对象编码成 JSON 字符串
json.loads()	    # 将已编码的 JSON 字符串解码为 Python 对象

json.dump()	    # 将Python内置类型序列化为json对象后写入文件
json.load()         # 读取文件中json形式的字符串转化为Python类型

json.dumps()

# dumps()函数可以将 Python 对象编码成 Json 字符串
json.dumps(obj,ensure_ascii=False,sort_keys,indent,separators) 
"""输入参数
常用参数
obj		    需要转换的python数据
ensure_ascii        默认值True,需要显示中文时,设置为False
indent		    根据数据格式缩进显示,int 代表缩进的位数
sort_keys           根据keys的值进行排序
separators          分隔符,默认的就是(',',':')

其他参数
encoding		默认是UTF-8
Skipkeys 		默认值是False,如果dict的keys内的数据不是python的基本类型会报TypeError,设置成True,则会跳过这类key
"""


d={'小明':{'sex':'男','addr':'上海','age':26},'小红':{ 'sex':'女','addr':'上海', 'age':24},}

print(json.dumps(d,ensure_ascii=False,indent=4)) 
# 显示中文,缩进为4
#执行结果:
{
    "小明": {
        "sex": "男",
        "addr": "上海",
        "age": 26
    },
    "小红": {
        "sex": "女",
        "addr": "上海",
        "age": 24
    }
}

注: 在这里我们可以看到,原先的单引号已经变成双引号

json.loads()

# loads()函数可以将 json 字符串转换成 Python 的数据类型
json.loads(s,object_hook,object_pairs_hook,parse_float,parse_int,)
"""输入参数
S 		        需要转成python对象的数据,可以str类型,也可以unicode类型

其他参数
object_hook	        None.返回结果字典替换为你所指定的类型
object_pairs_hook       None 将结果以key-value有序列表的形式
parse_float		None,符合float类型的字符串将被转为你所指定
parse_int		None,符合int类型的字符串将被转为你所指定
"""

# 这是users.json文件中的内容
'''
{
    "小明":{
        "sex":"男",
        "addr":"上海",
        "age":26
    },
    "小红":{
        "sex":"女",
        "addr":"上海",
        "age":24
    }
}
'''

  
import json  
#打开‘users.json’的json文件
f =open('users.json','r',encoding='utf-8')
#读文件
res=f.read()           # 必须需要读取文件 
print(json.loads(res))   

#执行结果:
{'小明': {'sex': '男', 'addr': '上海', 'age': 26}, '小红': {'sex': '女', 'addr': '上海', 'age': 24}}

json.dump()

# dump()函数可以将 Python对象编码成 json 字符串,并自动写入到文件中,不需要再单独写文件

json.dump(obj, fp, **)
"""输入参数
obj				需要转换的python数据
fp 				打开的文件

其他参数 和json.dumps() 相似

"""

d={'小明':{'sex':'男','addr':'上海','age':26},'小红':{ 'sex':'女','addr':'上海', 'age':24},}
#打开一个名字为‘users.json’的空文件
fw =open('users.json','w',encoding='utf-8')

json.dump(d,fw,ensure_ascii=False,indent=4)

json.load()

# load()跟loads()功能相似,load()函数可以将 json 字符串转换成 Python 数据类型
# 不同的是前者的参数是一个文件对象,不需要再单独读此文件

#把json串变成python的数据类型:字典,传一个文件对象,不需要再单独读文件 

# 打开文件
import json   
f =open('users.json','r',encoding='utf-8') 
print(json.load(f))

#执行结果:
{'小明': {'sex': '男', 'addr': '上海', 'age': 26}, '小红': {'sex': '女', 'addr': '上海', 'age': 24}}

两对函数异同点

json.dumps(obj) 
# 字典、对象 转 json (字符串)

json.loads(s)
#  json(字符串) 转 字典、对象

# 直接对数据进行操作
# 操作对象类型不同 字符串  


json.dump()

json.load()

# 直接对文件进行操作
# 操作对象类型不同 文件流

注意事项

# 针对将字符串、json 转 字典、对象
json.dumps(obj) 

mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23"}'
mes_to_dict = json.loads(mes)
print type(mes_to_dict)   # <type 'dict'>
# 以上代码是正常的

# 错误的写法为
mes = "{'InsId': 1, 'name': 'lege-error', 'CreationTime': '2019-04-24'}"
mes_to_dict = json.loads(mes)
# output >>> ValueError
 
# 补救方法
mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23"}'
mes_dict = eval(mes)
print type(mes_dict)
<type 'dict'>
posted @ 2021-06-22 21:31  贝壳里的星海  阅读(64)  评论(0编辑  收藏  举报