话在前:不足之前,请多多指教
一、多层字典解析问题
原题目
{ "Count":5, "Items": [ { "name":{"string":"a"}, "email":{"string":"abc@163.com"}, "friends": [ { "friend1": { "name": { "string": "name1" }, "sex": { "int": 1 }, "addr": { "string": "addr1" } } } ], "moreinfo":{ "Desc1":{"string":"aaaa"}, "Desc2":{"int":22}, "Desc3":{"list":["ddddd","11111"]} } } ] }
将上面的json文件,转化为python内容,并且去掉不需要的数据例如(包含对应的数据类型如:string,int,list)之后变为
{ "Count":5, "Items": [ { "name":"a", "email":"abc@163.com", "friends": [ { "friend1": { "name": "name1" "sex": 1 "addr": "addr1" } } ], "moreinfo":{ "Desc1":"aaaa", "Desc2":22, "Desc3":"ddddd","11111"} } } ] }
解题思路:使用递归解决多层字典的节点问题,子节点有列表和字典两种表现形式,所以这两种形式都是递归,
解题代码
import json # 修改的函数 def modify(dic): # 确保传进来的是一个字典,这里我并没有使用try-except做容错,只是简单的为了需求的实现 if isinstance(dic,dict): # 变量字典的key和value for key,val in dic.items(): # 这里多层字典嵌套的话,子层主要是字典或者列表的方式,方式这里主要针对子层是字典和列表两种方式处理 if isinstance(val,dict): # 如果val是一个字典,并且长度为1,说明是最内层的字典了,是需要做处理的地方了 if len(val) == 1: # 将内层字典的val赋值给上一层的key,即项目的需求 dic[key]=list(val.values())[0] # 如果不是最内层,继续递归 modify(val) # 内层数据是列表的情况 elif isinstance(val,list): if len(val)>0: for _dic in val: # 列表里面是字典继续递归 modify(_dic) if __name__ == '__main__': with open('./test_json.json', 'r') as fp: json_str = fp.read() json_dic = json.loads(json_str) print('修改前打印*********************') print(json_dic) modify(json_dic) print('修改后打印*********************') print(json_dic)
打印结果
修改前打印********************* {'Count': 5, 'Items': [{'name': {'string': 'a'}, 'email': {'string': 'abc@163.com'}, 'friends': [{'friend1': {'name': {'string': 'name1'}, 'sex': {'int': 1}, 'addr': {'string': 'addr1'}}}], 'moreinfo': {'Desc1': {'string': 'aaaa'}, 'Desc2': {'int': 22}, 'Desc3': {'list': ['ddddd', '11111']}}}]} 修改后打印********************* {'Count': 5, 'Items': [{'name': 'a', 'email': 'abc@163.com', 'friends': [{'friend1': {'name': 'name1', 'sex': 1, 'addr': 'addr1'}}], 'moreinfo': {'Desc1': 'aaaa', 'Desc2': 22, 'Desc3': ['ddddd', '11111']}}]}
二、mongodb的基本使用
原题目:
Mongodb 查询: Db.msg.find() { "_id" : ObjectId("5f96ef6c1fb5b9e52cd23179"), "msgId" : 1696261644, "fromUserName" : "user1", "toUserName" : "user2", "msgType" : 1, "content" : "ufne", "newMsgId" : NumberLong("4690548300089373689"), "createTime" : 1603727095 } { "_id" : ObjectId("5f96ef6c1fb5b9e52cd2317a"), "msgId" : 1696261645, "fromUserName" : "user2", "toUserName" : "user1", "msgType" : 10002, "content" : "<sysmsg type="ClientCheckConsistency"</ClientCheckConsistency></sysmsg>", "newMsgId" : NumberLong("4429536039473582128"), "createTime" : 1603727095 } { "_id" : ObjectId("5f96ef6c1fb5b9e52cd2317b"), "msgId" : 1696261647, "fromUserName" : "user1", "toUserName" : "user2", "msgType" : 1, "content" : "Hello", "newMsgId" : NumberLong("1453640785042681328"), "createTime" : 1603727109 } { "_id" : ObjectId("5f96ef6c1fb5b9e52cd2317c"), "msgId" : 1696261648, "fromUserName" : "user2", "toUserName" : "user1", "msgType" : 1, "content" : "gggg", "newMsgId" : NumberLong("4776642146216801785"), "createTime" : 1603727130 } …. 以user1,user2为例,需要获取 user1, user2 相互聊天信息中最后一条聊天的信息。 构造一个方法,获取查询记录中,指定用户的最后一条聊天记录。 Def get_last_msg(user:str) -> msg_dict:dict: 另外针对获取最后一条信息的场景,提出解决方案。
数据在mongodb中显示为
代码为
import pymongo # 链接mongodb pymongo_client = pymongo.MongoClient('mongodb://root:123456@127.0.0.1:27017') # 链接数据库 pymongo_db = pymongo_client['test_db'] # 链接表 pymongo_table = pymongo_db.test_table def get_last_msg(user): # 管道条件 pipeline = [ # 根据传递过来的用户进行搜索 {'$match':{'fromUserName':user}}, # 因为要最后一条,所以倒叙更方便 {'$sort': {'createTime': -1,}}, # 倒叙后取出第一条 {'$limit':1} ] # 插叙 ret = pymongo_table.aggregate(pipeline) ret1 = [u for u in ret] # 返回结果 return ret1[0] msg = get_last_msg('user2') # 打印验证 print(msg)
打印结果
{'_id': ObjectId('5fce176c3dcc6560be446156'), 'msgId': 1696261648.0, 'fromUserName': 'user2', 'toUserName': 'user1', 'msgType': 1.0, 'content': 'gggg', 'newMsgId': '"4776642146216801785"', 'createTime': 1603727130}
补充:另外针对获取最后一条信息的场景,提出解决方案,不是很理解,往有知道的朋友可以指点一二,感谢!