You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JSON中搜索指定字符串并判断其是否存在?代码问题求助

解决JSON中查找指定字符串是否存在的问题

你的代码目前有几个问题,导致输出大量None且无法正确定位嵌套结构里的目标字符串:

  1. 仅遍历顶层键值对:你的JSON里"veeti"藏在嵌套的author字典中,但代码只检查了第一层的value,没有递归进入子结构查找
  2. 循环内过早打印“未找到”日志:每遍历一个不匹配的键值对就输出日志,导致大量冗余信息,而且还没遍历完所有可能就提前判断未找到
  3. 未处理嵌套结构与非字符串类型:遇到子字典、数组这类嵌套结构时没有深入遍历,同时也没考虑数字、布尔值这类非字符串类型的处理
  4. 未找到时无明确返回:遍历完顶层元素后如果没匹配到,函数会默认返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:47:38