如何在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); } }
代码解释
- 递归逻辑:
flattenNode方法是核心,会逐层解析JSON节点,自动拼接父键前缀; - 数组兼容:针对你输入里的
data数组,代码会保持数组结构,只扁平化数组内部的对象; - 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
相关产品推荐
相关产品推荐

