json序列化

json模块作用

json模块可以将字典、列表等序列化对象转换成特殊的字符串,也就是json数据,再将这种特殊的字符串转换回来。主要的使用场景比如网络传输,文件存储数据。如果用str()方法转换成普通的字符串,没有办法再转换回原来的数据类型。eval方法除外,不推荐使用。json数据还是各种编程语言通用的数据类型,python的json数据,java也可以获取使用,十分方便。

json方法
json主要的方法比较简单,有四个,两两一对使用。

json.dump()、json.load():只能用于文件数据读写
json.dumps()、json.loads():既能用于文件读写,也能用于文件传输。

1. json模块在网络传输中的使用
这里我写了一个socket服务端和客户端,演示在网络中传输json数据:客户端发送给服务端一个消息,服务端返回一个字典转换成的json数据给客户端,客户端接收后再转换成字典类型并输出在屏幕上
服务端代码:

import socket
import json

server = socket.socket()
ip_addr = ('127.0.0.1',8222)
server.bind(ip_addr)
server.listen()

dict = {'status':'ok',
 'messages':[{'cityname':'石家庄'},{'citycode':'130100'}]
 }

while 1:
    conn,addr = server.accept()
    try:
        while 1:
            client_msg = conn.recv(1024).decode('utf-8')
            print(f'来自客户端的消息:{client_msg}')
            dict_json = json.dumps(dict)
            dict_byte = dict_json.encode('utf-8')
            conn.send(dict_byte)
            conn.close()
    except Exception:
        break

要点解释:

dict_json = json.dumps(dict) #这一步会将dict这个字典转换成特殊的字符串,也就是json数据
dict_byte = dict_json.encode(‘utf-8’) #将json数据编译成字节类型的数据,方便传输通信。

客户端代码:

import socket
import json

client = socket.socket()
client.connect(('127.0.0.1',8222))

msg = input("请输入需要发送的信息:").strip()
client.send(msg.encode('utf-8'))
data = client.recv(1024)
data = data.decode('utf-8')
print(f"接收到来自服务端的json_byte信息:{data},类型为{type(data)}")
data_json = json.loads(data)
print(f'得到json信息:{data_json},类型为{type(data_json)}')

要点解释:

data = client.recv(1024) #这一步是接收了服务点发送来的json的字节类型数据 data =
data.decode(‘utf-8’) #转换会json数据 data_json = json.loads(data)
#还原回字典类型数据

客户端结果展示:

请输入需要发送的信息:nihao
接收到来自服务端的json_byte信息:{"status": "ok", "messages": [{"cityname": "\u77f3\u5bb6\u5e84"}, {"citycode": "130100"}]},类型为<class 'str'>
得到json信息:{'status': 'ok', 'messages': [{'cityname': '石家庄'}, {'citycode': '130100'}]},类型为<class 'dict'>

2. 在文件中传输
上面讲了json.dumps()和json.loads()也可以用于在文件中传输转换,下面进行演示:
json.dumps()转换后写入

import json
dict = {'status':'ok',
 'messages':[{'cityname':'石家庄'},{'citycode':'130100'}]
 }
dict_json = json.dumps(dict)
with open('api.json','w',encoding='utf-8') as f:
    f.write(dict_json)

api.json文件内容:

{"status": "ok", "messages": [{"cityname": "\u77f3\u5bb6\u5e84"}, {"citycode": "130100"}]}

json.loads()方法读取

import json
with open('api.json',encoding='utf-8') as f:
    ret = f.read()
    ret2 = json.loads(ret)
    print(ret2,type(ret2))

输出:

{'status': 'ok', 'messages': [{'cityname': '石家庄'}, {'citycode': '130100'}]} <class 'dict'>

上面讲完了dumps和loads。接下来演示dump和load这一组方法
和dumps,loads不同,dumps和loads需要先转换成json序列,然后在进行写入。dump和load可以简写一些:

import json
dict = {'status':'ok',
 'messages':[{'cityname':'石家庄'},{'citycode':'130100'}]
 }
# dict_json = json.dumps(dict)
with open('api.json','w',encoding='utf-8') as f:
    json.dump(dict,f)   #这里传入序列化对象和文件句柄

with open('api.json',encoding='utf-8') as f:
    # ret = f.read()
    # ret2 = json.loads(ret)
    ret2 = json.load(f) 
    print(ret2,type(ret2))

输出和上面的也是一样的。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值