如何在JSON中搜索指定字符串并判断其是否存在?代码问题求助
解决JSON中查找指定字符串是否存在的问题
你的代码目前有几个问题,导致输出大量None且无法正确定位嵌套结构里的目标字符串:
- 仅遍历顶层键值对:你的JSON里
"veeti"藏在嵌套的author字典中,但代码只检查了第一层的value,没有递归进入子结构查找 - 循环内过早打印“未找到”日志:每遍历一个不匹配的键值对就输出日志,导致大量冗余信息,而且还没遍历完所有可能就提前判断未找到
- 未处理嵌套结构与非字符串类型:遇到子字典、数组这类嵌套结构时没有深入遍历,同时也没考虑数字、布尔值这类非字符串类型的处理
- 未找到时无明确返回:遍历完顶层元素后如果没匹配到,函数会默认返回
None
修正后的递归实现
这里给出一个能递归遍历整个JSON结构(支持嵌套字典和数组),专门用来判断目标字符串是否存在的函数:
def is_string_present(self, target_str, input_data): self.logger.info("开始查找字符串: %s", target_str) # 当前数据是字符串,直接比较判断 if isinstance(input_data, str): return input_data == target_str # 当前是字典,遍历所有值递归查找 if isinstance(input_data, dict): for value in input_data.values(): if self.is_string_present(target_str, value): return True # 当前是列表/数组,遍历每个元素递归查找 if isinstance(input_data, (list, tuple)): for item in input_data: if self.is_string_present(target_str, item): return True # 所有情况都不匹配,返回False return False
调用方式
# 调用后会返回True或False,直接表示字符串是否存在 result = parser.is_string_present("veeti", parser.data) self.logger.info("字符串是否存在: %s", result)
代码说明
- 递归遍历:不管是多层嵌套的字典还是数组,都会逐层深入查找,不会遗漏嵌套内容
- 类型安全判断:先检查当前数据是否为字符串,再处理字典和数组,避免类型错误
- 提前终止:一旦找到匹配的字符串就立即返回
True,无需继续遍历剩余元素,提升效率 - 明确返回值:遍历完所有可能后明确返回
False,不会再出现无意义的None
扩展:返回找到的字符串而非布尔值
如果你的需求是找到目标字符串后返回它,而不是仅判断存在性,可以用这个版本:
def find_target_string(self, target_str, input_data): if isinstance(input_data, str): if input_data == target_str: return input_data return None if isinstance(input_data, dict): for value in input_data.values(): result = self.find_target_string(target_str, value) if result is not None: return result if isinstance(input_data, (list, tuple)): for item in input_data: result = self.find_target_string(target_str, item) if result is not None: return result return None
调用后会返回目标字符串(找到时)或None(未找到时),同时不会产生大量冗余日志。
内容的提问来源于stack exchange,提问作者Shalomi90
相关产品推荐
相关产品推荐

