如何将非规范化CSV转换为复杂JSON/Java对象?求工具推荐
可行的工具与库方案
针对非规范化CSV转嵌套JSON/Java对象的需求,以下是不同技术栈下的实用方案,均支持批量处理各类CSV:
1. Python 生态
Python在结构化数据转换上灵活性极强,推荐两种常用组合:
pandas + json
利用pandas的分组聚合能力直接实现转换:
import pandas as pd import json # 读取CSV文件 df = pd.read_csv('input.csv') # 按用户维度分组,将产品信息打包为字典列表 grouped_data = df.groupby(['user_id', 'nickname', 'joinDate'], as_index=False).apply( lambda x: x[['product_id', 'price']].to_dict('records') ).rename('orders') # 转换为目标JSON格式 result_json = grouped_data.to_json(orient='records', indent=2) print(result_json)
pandas能自动处理CSV的格式兼容问题,只需调整分组字段和嵌套字段,就能适配不同结构的CSV。
jq(命令行工具)
适合习惯用命令行批量处理的场景,需先安装csvkit(提供csvjson命令)和jq:
# 先将CSV转为JSON数组,再按user_id分组生成嵌套结构 csvjson input.csv | jq 'group_by(.user_id) | map({ user_id: .[0].user_id, nickname: .[0].nickname, joinDate: .[0].joinDate, orders: map({product_id, price}) })'
2. Java 生态
如果需要生成Java对象或在Java项目中集成,推荐以下方案:
OpenCSV + Jackson
先定义对应实体类:
// 用户实体类 public class User { private int user_id; private String nickname; private String joinDate; private List<Order> orders; // 构造器、Getter、Setter方法 } // 订单实体类 public class Order { private String product_id; private int price; // 构造器、Getter、Setter方法 }
再实现读取与转换逻辑:
import com.opencsv.CSVReader; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.FileReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class CsvTransformer { public static void main(String[] args) throws Exception { CSVReader reader = new CSVReader(new FileReader("input.csv")); reader.readNext(); // 跳过表头 String[] line; Map<Integer, User> userMap = new HashMap<>(); while ((line = reader.readNext()) != null) { int userId = Integer.parseInt(line[0]); User user = userMap.getOrDefault(userId, new User()); // 首次读取用户时赋值基础信息 if (user.getUser_id() == 0) { user.setUser_id(userId); user.setNickname(line[1]); user.setJoinDate(line[2]); user.setOrders(new ArrayList<>()); } // 封装订单信息并添加到用户订单列表 Order order = new Order(); order.setProduct_id(line[3]); order.setPrice(Integer.parseInt(line[4])); user.getOrders().add(order); userMap.put(userId, user); } // 转换为JSON输出,或直接使用userMap中的Java对象 ObjectMapper mapper = new ObjectMapper(); String targetJson = mapper.writerWithDefaultPrettyPrinter() .writeValueAsString(new ArrayList<>(userMap.values())); System.out.println(targetJson); } }
只需调整实体类字段和映射逻辑,就能适配不同结构的CSV。
3. 无代码工具(适合非开发人员)
- CSV Hero:支持可视化配置分组规则与嵌套结构,直接导出目标JSON,无需编写代码。
- Convertio:在线工具,支持自定义转换规则,能快速处理简单的嵌套结构转换,适合小批量文件。
所有方案的核心逻辑都是分组聚合:按用户唯一标识(如user_id)分组,将重复行中的明细字段打包为数组,适配各类类似结构的CSV转换需求。
内容的提问来源于stack exchange,提问作者KBB
相关产品推荐
相关产品推荐

