在Java开发中,将对象列表转换为嵌套JSON结构是处理复杂数据展示的常见需求,比如需要将用户列表和对应的订单信息组合成层级结构的JSON返回给前端。不同的转换方案在效率和实现复杂度上存在差异,选择合适的方案能大幅提升开发效率。

常见转换方案对比
目前Java生态中主流的JSON处理工具都支持对象到JSON的转换,不同工具在嵌套结构处理上的表现如下:
| 工具名称 | 转换效率 | 代码复杂度 | 嵌套结构支持 |
|---|---|---|---|
| Jackson | 高 | 低 | 原生支持 |
| Gson | 中等 | 低 | 原生支持 |
| Fastjson | 高 | 低 | 原生支持 |
基于Jackson的实现方式
Jackson是Spring框架默认的JSON处理工具,性能和易用性都比较出色,以下是将用户对象列表转换为包含订单嵌套结构的示例。
定义实体类
首先定义用户和订单两个实体类,订单作为用户的嵌套属性:
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
// 订单实体类
class Order {
private String orderId;
private Double amount;
// 构造方法、getter、setter
public Order(String orderId, Double amount) {
this.orderId = orderId;
this.amount = amount;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public Double getAmount() {
return amount;
}
public void setAmount(Double amount) {
this.amount = amount;
}
}
// 用户实体类,包含订单列表嵌套属性
class User {
private String userId;
private String userName;
private List<Order> orders;
// 构造方法、getter、setter
public User(String userId, String userName, List<Order> orders) {
this.userId = userId;
this.userName = userName;
this.orders = orders;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
}
执行转换操作
使用Jackson的ObjectMapper直接转换对象列表,嵌套结构会自动处理:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;
public class JsonConvertDemo {
public static void main(String[] args) throws JsonProcessingException {
// 构建测试数据
List<Order> orderList1 = new ArrayList<>();
orderList1.add(new Order("O001", 199.9));
orderList1.add(new Order("O002", 299.9));
List<Order> orderList2 = new ArrayList<>();
orderList2.add(new Order("O003", 399.9));
List<User> userList = new ArrayList<>();
userList.add(new User("U001", "张三", orderList1));
userList.add(new User("U002", "李四", orderList2));
// 执行转换
ObjectMapper objectMapper = new ObjectMapper();
String jsonResult = objectMapper.writeValueAsString(userList);
System.out.println(jsonResult);
}
}
运行上述代码后,输出的JSON结构如下,订单列表会自动嵌套在用户对象内部:
[
{
"userId": "U001",
"userName": "张三",
"orders": [
{"orderId": "O001", "amount": 199.9},
{"orderId": "O002", "amount": 299.9}
]
},
{
"userId": "U002",
"userName": "李四",
"orders": [
{"orderId": "O003", "amount": 399.9}
]
}
]
转换注意事项
- 实体类的属性需要有对应的getter方法,否则JSON工具无法获取属性值,导致转换后属性缺失。
- 如果存在循环引用的情况,比如用户关联订单,订单又关联用户,需要添加
@JsonIgnore注解忽略其中一个引用,避免转换时出现栈溢出。 - 如果需要对JSON的字段名进行自定义,可以使用
@JsonProperty注解指定转换后的字段名称,不需要和实体类属性名完全一致。 - 对于大量数据的转换场景,建议复用ObjectMapper实例,避免频繁创建实例带来的性能损耗。
自定义嵌套结构转换
如果默认的嵌套结构不符合需求,比如需要将用户按照部门分组,再转换为嵌套JSON,可以手动构建Map结构再转换:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CustomNestedDemo {
public static void main(String[] args) throws JsonProcessingException {
// 构建测试用户数据
List<User> userList = new ArrayList<>();
userList.add(new User("U001", "张三", null));
userList.add(new User("U002", "李四", null));
userList.add(new User("U003", "王五", null));
// 按部门分组,构建自定义嵌套结构
Map<String, List<User>> deptUserMap = new HashMap<>();
deptUserMap.put("技术部", userList.subList(0, 2));
deptUserMap.put("产品部", userList.subList(2, 3));
// 转换为JSON
ObjectMapper objectMapper = new ObjectMapper();
String jsonResult = objectMapper.writeValueAsString(deptUserMap);
System.out.println(jsonResult);
}
}
这种方式可以灵活控制嵌套的层级和结构,适合复杂的业务场景。