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

如何在Java中处理嵌套JSON数据以实现扁平化结构

解决方案:Java实现JSON扁平化

我来帮你搞定这个JSON扁平化的需求!你要把嵌套的JSON结构转成带父键前缀的扁平格式,用Java实现对吧?下面给你一套实用的方案,用Jackson库来完成——这也是Java生态里处理JSON最常用的工具之一。

思路说明

核心思路是递归遍历JSON节点:遇到嵌套的对象节点时,把父节点的键名作为前缀,和子节点的键名用下划线拼接;遇到数组则保持数组结构,只扁平化数组内部的对象;基本类型节点直接保留,最终生成你想要的扁平结构。

步骤1:引入Jackson依赖

如果你的项目用Maven管理,在pom.xml里添加以下依赖(版本可以用最新稳定版):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

步骤2:编写扁平化工具类

直接复制这段代码就能用,里面包含了完整的扁平化逻辑和测试示例:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.Iterator;
import java.util.Map;

public class JsonFlattener {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    // 扁平化单个JSON对象节点
    public static ObjectNode flattenObjectNode(ObjectNode node) {
        ObjectNode flattenedNode = objectMapper.createObjectNode();
        flattenNode(node, "", flattenedNode);
        return flattenedNode;
    }

    // 递归处理所有节点
    private static void flattenNode(JsonNode node, String prefix, ObjectNode result) {
        if (node.isObject()) {
            Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
            while (fields.hasNext()) {
                Map.Entry<String, JsonNode> entry = fields.next();
                String newPrefix = prefix.isEmpty() ? entry.getKey() : prefix + "_" + entry.getKey();
                flattenNode(entry.getValue(), newPrefix, result);
            }
        } else if (node.isArray()) {
            // 保持数组结构,仅扁平化数组内的对象
            for (int i = 0; i < node.size(); i++) {
                JsonNode arrayItem = node.get(i);
                if (arrayItem.isObject()) {
                    ObjectNode flattenedItem = flattenObjectNode((ObjectNode) arrayItem);
                    result.set(String.valueOf(i), flattenedItem);
                } else {
                    result.set(prefix + "_" + i, arrayItem);
                }
            }
        } else {
            // 基本类型节点直接添加到结果
            result.set(prefix, node);
        }
    }

    // 处理完整的JSON字符串
    public static String flattenJson(String jsonStr) throws Exception {
        JsonNode rootNode = objectMapper.readTree(jsonStr);
        if (rootNode.isObject()) {
            ObjectNode rootObject = (ObjectNode) rootNode;
            Iterator<Map.Entry<String, JsonNode>> fields = rootObject.fields();
            ObjectNode result = objectMapper.createObjectNode();
            while (fields.hasNext()) {
                Map.Entry<String, JsonNode> entry = fields.next();
                if (entry.getValue().isArray()) {
                    ObjectNode arrayResult = objectMapper.createObjectNode();
                    flattenNode(entry.getValue(), entry.getKey(), arrayResult);
                    result.set(entry.getKey(), arrayResult.get(entry.getKey()));
                } else {
                    flattenNode(entry.getValue(), entry.getKey(), result);
                }
            }
            return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(result);
        }
        return jsonStr;
    }

    public static void main(String[] args) throws Exception {
        // 你的输入JSON
        String inputJson = "{ \"data\": [ { \"id\": \"5ab892c71810e201e81b9d39\", \"isSignedUpUsingFb\": false, \"personalInformation\": { \"firstName\": \"jio\", \"lastName\": \"g\", \"mobileNumber\": \"1234567890\" }, \"accountBalance\": 0 } ] }";
        
        // 执行扁平化
        String flattenedJson = flattenJson(inputJson);
        
        // 输出结果
        System.out.println(flattenedJson);
    }
}

代码解释

  1. 递归逻辑:flattenNode方法是核心,会逐层解析JSON节点,自动拼接父键前缀;
  2. 数组兼容:针对你输入里的data数组,代码会保持数组结构,只扁平化数组内部的对象;
  3. Jackson操作:用ObjectMapper解析和生成JSON,ObjectNode用于灵活操作JSON对象节点。

运行结果

运行main方法后,输出的JSON就是你想要的扁平结构:

{
  "data" : [ {
    "id" : "5ab892c71810e201e81b9d39",
    "isSignedUpUsingFb" : false,
    "personalInformation_firstName" : "jio",
    "personalInformation_lastName" : "g",
    "personalInformation_mobileNumber" : "1234567890",
    "accountBalance" : 0
  } ]
}

你可以直接把这段代码集成到项目里,调整Jackson版本适配你的项目即可。

内容的提问来源于stack exchange,提问作者Code_Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:45:48