约20份JSON属性文件提取公共属性的高效方案咨询
多JSON文件公共属性提取方案
针对20份JSON文件提取公共属性的需求,这里提供几种高效的实现方案,替代仅支持两两对比的Guava工具:
方案1:Java代码手动实现(结合Jackson/Gson)
这是最灵活可控的方式,核心思路是逐步求所有文件属性键的交集:
- 读取所有JSON文件,解析为可遍历的JSON对象(或Map)
- 以第一个文件的所有属性键作为初始公共集合
- 遍历剩余文件,每次将当前公共集合与该文件的属性键取交集
- 最终剩余的集合即为所有文件的公共属性键
示例代码(基于Jackson)
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class CommonJsonKeysExtractor { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); // 替换为你的JSON文件目录 File[] jsonFiles = new File("/your/json/directory") .listFiles((dir, name) -> name.toLowerCase().endsWith(".json")); // 初始化公共键集合为第一个文件的所有键 JsonNode firstJson = mapper.readTree(jsonFiles[0]); Set<String> commonKeys = new HashSet<>(); Iterator<String> keyIter = firstJson.fieldNames(); while (keyIter.hasNext()) { commonKeys.add(keyIter.next()); } // 遍历剩余文件,逐步缩小公共键集合 for (int i = 1; i < jsonFiles.length; i++) { JsonNode currentJson = mapper.readTree(jsonFiles[i]); Set<String> currentKeys = new HashSet<>(); Iterator<String> currentIter = currentJson.fieldNames(); while (currentIter.hasNext()) { currentKeys.add(currentIter.next()); } // 求交集,仅保留同时存在的键 commonKeys.retainAll(currentKeys); // 提前终止:如果公共键为空,无需继续遍历 if (commonKeys.isEmpty()) break; } System.out.println("所有文件的公共属性键:" + commonKeys); } }
方案2:借助Apache Commons Collections简化集合操作
如果不想手动处理集合交集逻辑,可以用Apache Commons Collections的工具类简化代码:
- 先引入Maven依赖:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency>
- 修改核心交集逻辑:
// 替换原有的commonKeys.retainAll(currentKeys) commonKeys = new HashSet<>(CollectionUtils.intersection(commonKeys, currentKeys));
方案3:命令行工具快速验证(非编程场景)
如果只是临时需求,不想写代码,用jq命令行工具可以快速完成:
# 初始化公共键为第一个文件的键 common_keys=$(jq 'keys' file1.json) # 遍历其余19个文件 for file in file2.json file3.json ... file20.json; do current_keys=$(jq 'keys' "$file") # 用jq的intersect方法求两个键数组的交集 common_keys=$(jq -n --argjson a "$common_keys" --argjson b "$current_keys" '$a | intersect($b)') done # 打印最终结果 echo "$common_keys"
额外说明
- 如果需要处理嵌套属性(比如
user.address.city这种层级路径),需要修改代码递归遍历所有嵌套节点,将完整路径作为键存入集合再求交集。 - 处理超大JSON文件时,建议使用Jackson的
JsonParser流式解析,避免内存溢出。
内容的提问来源于stack exchange,提问作者NehaGoswami
相关产品推荐
相关产品推荐

