前言
说下最近使用AICoding解决问题和写demo的感受:如果需求明确的话大体提高了解决问题的效率,降低了在网上搜索花费的时间。
之前我认为AICoding对于像我这种写业务的带来的帮助是在可能涉及算法方面的帮助,最近切实的去解决问题发现还有个帮助是在知识盲区(之前解决的一些问题或走通某个点靠的是在网上查资料的运气,AI确实很大程度上比我们直接搜索筛选来的更快,但也不要相信AI一定能够100%的去完全补上我们碰到问题的盲区)。下面分享下在帮助下解决碰到的两个问题。
问题1.解决问题与解惑
前段时间有个老接口现场反应慢有数据挤压让处理下。
开始的时候我简单的认为是有些验证sql慢,然后就找了下代码发现那些校验的逻辑也不复杂,然后有模有样的跑到生产库跑了下发现并不慢;愣了一阵没办法只有给现场个Arthas包观察下了,看了后发现是拿数据连接的地方慢(关于拿连接慢的具体原因我没细致排查,当时看了网络ping了下好像是并不慢的,服务器的运行细节忘记看了)。最后解决是加了个数据库连接池(因为那个系统是有个多个数据源直接用的最基础的JDBC),让代码插件生了一段工具代码,最后解决问题。
衍生的一个疑惑
之前的代码数据库操作是直接JDBC的,现在我给改成了从连接池拿连接这里我有了一个疑惑数据连接释放的问题需不需要处理。看到这里的你可以思考下你的想法以及原因。答案是不用的,为什么我问了AI给了我解释,让我对连接池加强了点理解吧(因为连接池的连接走的是代理,老的释放方法在代理里面做了处理的,连接池是可以感知到的)。
问题2.做了一个简单的工具
功能:从文件里面提取所有的JSON串,然后提取有对应key的值
因为有一天处理数据的时候需要这样个工具,当时是在网上找了一个。后面想用pyqt写个demo就拿来仿了这样一个工具。
(代码一部分是网上的一部分是AI写的,下面是主要的工具代码)
'''
初步版本:只能提取文本中唯一的json字符串
从文本中提取出json字符串,首先去除前后多余的内容,然后将其转换成字典返回。
局限:文本中只能有一个json字符串,该json字符串前后的内容中不能有{和}。
说明:json字符串内部还有{和}不影响提取和解析。JSON字符串前后没有多余内容时也能正常提取和解析。
'''
def convert_json_in_text_to_dict(text):
# 去除{之前的多余内容,这条语句同时适用于{之前没有多余内容的情况
t = text[len(text.split('{')[0]):]
suffix_length = len(text.split('}')[-1])
# 去除}之后的多余内容, }之后没有多余内容时,则不用处理
if suffix_length:
t = t[:-suffix_length]
# 转换成字典返回
return json.loads(t)
'''
进阶版本:能提取任意多个json字符串。
从文本中提取出所有json字符串,将它们转换成字典,最后返回字典组成的列表。
说明:输入的文本中可以有不属于任何json字符串的内容,
但是这些内容中不能有{和},否则可能影响json字符串的定界。
文本中可以有多个json字符串。
json字符串内部可以嵌套成对的{}。但是不能有不成对的{或者}。
实现说明:这里用栈的来匹配左右花括号,从而定界每一个json字符串。
按index遍历输入的文本,每到遇到{,则将其index入栈,每当遇到},则弹出栈内的一个{,
如果弹出后栈为空了,说明到了一个json字符串的结尾。
而刚刚弹出的元素值就是这个json字符串的开始位置。
'''
def convert_all_json_in_text_to_dict(text):
dicts, stack = [], []
for i in range(len(text)):
if text[i] == '{':
stack.append(i)
elif text[i] == '}':
begin = stack.pop()
if not stack:
dicts.append(json.loads(text[begin:i+1]))
return dicts
def getFileJson(filePath,keys):
if not os.path.exists(filePath):
print("文件不存在")
return
result = []
content = ''
# with open(filePath, "r") as f: # 打开文件
# data = f.read() # 读取文件
# text2 += data
try:
with open(filePath, "r", encoding="utf-8") as f: # 打开文件
content = f.read() # 读取全部内容
except FileNotFoundError:
print(f"错误:文件 {filePath} 未找到。")
content = ""
except PermissionError:
print(f"错误:没有权限读取文件 {filePath}。")
content = ""
except UnicodeDecodeError:
print(f"错误:文件 {filePath} 的编码格式不正确。")
try:
with open(filePath, 'r', encoding='gbk') as f:
content = f.read() # 读取全部内容
except UnicodeDecodeError as gbk_error:
raise RuntimeError(f"无法用 utf-8 或 gbk 编码读取文件: {filePath}") from gbk_error
except Exception as e:
print(f"读取文件 {filePath} 时发生未知错误: {e}")
content = ""
if not content:
return
ds = convert_all_json_in_text_to_dict(content)
for key in keys:
result.append("---{}---".format(key))
for i in range(len(ds)):
#print(key)
result0=find_key_in_json(ds[i], key)
#print(result0)
if len(result0)>0:
result+=result0
return result
def find_key_in_json(data, target_key):
"""
递归查找 JSON 中的所有 target_key 对应的值
:param data: JSON 数据(字典、列表或其他基本类型)
:param target_key: 要查找的键名(字符串)
:return: 所有匹配的值组成的列表
"""
results = []
#print(str(data))
def recursive_search(element):
if isinstance(element, dict):
for key, value in element.items():
#print(key)
if key == target_key:
results.append(value)
recursive_search(value)
elif isinstance(element, list):
for item in element:
recursive_search(item)
recursive_search(data)
return results