如何在Dart/Flutter中实现未知键的JSON对象全值搜索过滤?
实现未知键的JSON全值搜索过滤
核心思路
写一个递归函数,遍历目标JSON对象的所有层级的键值对,检查是否存在任意值包含搜索字符串。只要对象中某一个值匹配,就将该对象纳入过滤结果。
Dart 实现示例
首先实现递归检查函数:
bool hasMatchingValue(dynamic obj, String searchString) { // 处理字符串类型,直接判断是否包含 if (obj is String) { return obj.contains(searchString); } // 处理数组类型,遍历每个元素递归检查 if (obj is List) { return obj.any((item) => hasMatchingValue(item, searchString)); } // 处理对象类型,遍历所有值递归检查 if (obj is Map) { return obj.values.any((value) => hasMatchingValue(value, searchString)); } // 其他类型(数字、布尔等),直接返回false;若需匹配可转字符串判断 return false; }
然后用这个函数替换原来的指定键判断:
// 假设object是List<Map>类型的集合 final filteredObjects = object.where((o) => hasMatchingValue(o, searchString)).toList();
补充说明
- 如果需要匹配数字、布尔等非字符串类型,可以在递归函数里添加类型转换判断:
if (obj is num || obj is bool) { return obj.toString().contains(searchString); } - 递归逻辑会自动处理嵌套的JSON结构(比如对象里的数组、数组里的对象),无需额外处理层级问题。
内容的提问来源于stack exchange,提问作者somethingstrang
相关产品推荐
相关产品推荐

