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

约20份JSON属性文件提取公共属性的高效方案咨询

多JSON文件公共属性提取方案

针对20份JSON文件提取公共属性的需求,这里提供几种高效的实现方案,替代仅支持两两对比的Guava工具:

方案1:Java代码手动实现(结合Jackson/Gson)

这是最灵活可控的方式,核心思路是逐步求所有文件属性键的交集:

  1. 读取所有JSON文件,解析为可遍历的JSON对象(或Map)
  2. 以第一个文件的所有属性键作为初始公共集合
  3. 遍历剩余文件,每次将当前公共集合与该文件的属性键取交集
  4. 最终剩余的集合即为所有文件的公共属性键

示例代码(基于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的工具类简化代码:

  1. 先引入Maven依赖:
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>
  1. 修改核心交集逻辑:
// 替换原有的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:32:50