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

如何在Java中将表数据写入指定格式的JSON文件?

嘿,我懂你要做的事——把数据库表的数据转换成那种层级分明的JSON,每个公司下面挂着不同部门(比如IT、SALES),部门里又有一堆分类条目对吧?我用Java里最常用的Jackson库给你整一套完整的实现方案,一步步来:

1. 先定义对应Java实体类

要把JSON结构映射成Java对象,这样填充数据和序列化才方便。

首先是部门里的分类条目类(对应你JSON里IT/SALES数组里的每个对象):

public class Category {
    private String type_3;
    private String type_2;
    private String type_1;
    private String cat_no;
    private String cat_desc;

    // 记得生成无参构造、全参构造,还有所有字段的getter和setter
    // 用IDE就能自动生成,比如IntelliJ按Alt+Insert选Constructor/Getter and Setter就行
}

然后是公司类,这里我用Map<String, List<Category>>来存动态的部门——毕竟你例子里有IT、SALES、MAR...,部门名称不固定的话,用Map比硬编码字段灵活多了:

import java.util.List;
import java.util.Map;

public class Company {
    private String com_name;
    private int com_code;
    private Map<String, List<Category>> departments;

    // 同样生成无参、全参构造,以及getter/setter
}
2. 从数据库查数据并组装成实体对象

我这里用JDBC举例子(要是你用MyBatis或者JPA,逻辑类似,只是查询方式不同),给你一个简单的组装逻辑:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DataLoader {
    public static List<Company> loadCompaniesFromDB() {
        List<Company> companies = new ArrayList<>();
        // 替换成你的数据库连接信息
        String url = "jdbc:mysql://localhost:3306/your_database";
        String user = "your_username";
        String password = "your_password";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            // 先查所有公司的基础信息
            String companySql = "SELECT com_name, com_code FROM companies";
            try (PreparedStatement companyStmt = conn.prepareStatement(companySql);
                 ResultSet companyRs = companyStmt.executeQuery()) {

                while (companyRs.next()) {
                    Company company = new Company();
                    company.setCom_name(companyRs.getString("com_name"));
                    company.setCom_code(companyRs.getInt("com_code"));

                    Map<String, List<Category>> departments = new HashMap<>();

                    // 查这个公司下所有部门的分类数据,这里假设你的表有company_code、department_name关联字段
                    String categorySql = "SELECT department_name, type_3, type_2, type_1, cat_no, cat_desc " +
                            "FROM categories WHERE company_code = ?";
                    try (PreparedStatement categoryStmt = conn.prepareStatement(categorySql)) {
                        categoryStmt.setInt(1, company.getCom_code());
                        try (ResultSet categoryRs = categoryStmt.executeQuery()) {

                            while (categoryRs.next()) {
                                String deptName = categoryRs.getString("department_name");
                                Category category = new Category();
                                category.setType_3(categoryRs.getString("type_3"));
                                category.setType_2(categoryRs.getString("type_2"));
                                category.setType_1(categoryRs.getString("type_1"));
                                category.setCat_no(categoryRs.getString("cat_no"));
                                category.setCat_desc(categoryRs.getString("cat_desc"));

                                // 部门不存在就创建空列表,再添加分类
                                departments.computeIfAbsent(deptName, k -> new ArrayList<>()).add(category);
                            }
                        }
                    }

                    company.setDepartments(departments);
                    companies.add(company);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return companies;
    }
}

注意:这里用了PreparedStatement防止SQL注入,实际项目千万别用Statement拼接SQL,安全第一!

3. 把实体序列化成JSON并写入文件

用Jackson的ObjectMapper来搞定序列化,还能输出格式化后的JSON,可读性更强:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.List;

public class JsonWriter {
    public static void main(String[] args) {
        // 从数据库加载数据
        List<Company> companies = DataLoader.loadCompaniesFromDB();

        ObjectMapper mapper = new ObjectMapper();
        try {
            // 写入文件,writerWithDefaultPrettyPrinter()会给JSON加缩进,看着舒服
            mapper.writerWithDefaultPrettyPrinter().writeValue(new File("company_data.json"), companies);
            System.out.println("JSON文件生成成功啦!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4. 依赖配置(Maven为例)

如果用Maven管理项目,得在pom.xml里加Jackson的依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 用最新的稳定版就行 -->
</dependency>
额外小技巧
  • 如果你的部门是固定的(比如只有IT、SALES、MARKETING),可以把Company类里的Map换成单独的字段,比如List<Category> it,然后加@JsonProperty("IT")注解指定JSON键名,这样结构更固定。
  • 要是想把null值转换成空字符串,可以在实体类字段上加@JsonInclude(JsonInclude.Include.NON_NULL),或者给ObjectMapper配置序列化规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:36:49