如何在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
相关产品推荐
相关产品推荐

