如何用Java将数据库数据转换为指定格式的JSON?
问题描述
数据库里的数据是这样的:
[ { "id": 1, "values": "80,90", "name": "number" }, { "id": 2, "values": "22351,25252,27123,29123,32123", "name": "numbers_1" }, { "id": 3, "values": "12351,15252,17123,19123,12123", "name": "numbers_2" } ]
要转成下面这种格式的JSON:
[ { "id": 1, "highNumber": "80", "numbers": [ { "id": 2, "numbersCode": "22351,25252,27123,29123,32123" } ] }, { "id": 2, "highNumber": "90", "numbers": [ { "id": 1, "numbersCode": "22351,25252,27123,29123,32123" } ] } ]
JDBC连接已经写好了,但不知道while循环里该怎么写逻辑,现有代码如下:
public List<Number> getAllNumber() { List<Number> list = new ArrayList<>(); try { Class.forName("DriverClass"); Connection conn = JDBCUtils.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); while (rs.next()) { String number= rs.getString("VALUES"); System.out.println(number); } } catch (Exception e) { e.printStackTrace(); } return list; }
核心需求就是给80和90分别配上指定的numbersCode数据。
解决方案
1. 先定义对应实体类
要生成目标JSON,得先建匹配结构的实体类:
// 对应numbers里的子对象 class NumberItem { private int id; private String numbersCode; public NumberItem(int id, String numbersCode) { this.id = id; this.numbersCode = numbersCode; } // 自行补充getter和setter方法 } // 外层的主对象 class NumberDTO { private int id; private String highNumber; private List<NumberItem> numbers; public NumberDTO(int id, String highNumber, List<NumberItem> numbers) { this.id = id; this.highNumber = highNumber; this.numbers = numbers; } // 自行补充getter和setter方法 }
2. 修改JDBC逻辑
先把数据库里的数据分两类存储:一类是number对应的80、90,另一类是numbers_1里的目标编码串,再组装成需要的结构。修改后的代码:
public List<NumberDTO> getAllNumber() { List<NumberDTO> resultList = new ArrayList<>(); String targetCode = ""; List<String> highNums = new ArrayList<>(); try { Class.forName("DriverClass"); Connection conn = JDBCUtils.getConnection(); // 替换成你实际的表名 PreparedStatement ps = conn.prepareStatement("SELECT id, values, name FROM your_table"); ResultSet rs = ps.executeQuery(); // 先遍历所有数据,提取需要的内容 while (rs.next()) { String name = rs.getString("name"); String values = rs.getString("values"); if ("number".equals(name)) { // 拆分80和90,存入列表 String[] nums = values.split(","); for (String num : nums) { highNums.add(num.trim()); } } else if ("numbers_1".equals(name)) { // 拿到目标编码串 targetCode = values; } } // 组装目标结构 for (int i = 0; i < highNums.size(); i++) { int dtoId = i + 1; // 外层id从1开始递增 String highNum = highNums.get(i); // 组装numbers列表,这里用原数据中numbers_1的id(2),如需动态对应可调整 List<NumberItem> items = Collections.singletonList(new NumberItem(2, targetCode)); resultList.add(new NumberDTO(dtoId, highNum, items)); } // 关闭资源,避免泄漏 rs.close(); ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } return resultList; }
3. 转换为JSON字符串
如果要把最终的List转成JSON字符串,可以用Jackson或Gson这类库,以Jackson为例:
ObjectMapper mapper = new ObjectMapper(); String jsonResult = mapper.writeValueAsString(resultList); System.out.println(jsonResult);
内容的提问来源于stack exchange,提问作者Boris s
相关产品推荐
相关产品推荐

