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

如何将非规范化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:17:04