如何使用Jackson在Spring Batch中创建嵌套JSON?
实现嵌套JSON的步骤
1. 完善BusinessInformation模型类
先写出符合Jackson序列化要求的嵌套类,搭配Lombok注解简化代码:
package model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @AllArgsConstructor @NoArgsConstructor @Builder @JsonIgnoreProperties(ignoreUnknown = true) public class BusinessInformation implements Serializable { @JsonProperty("BusinessContactName") private String businessContactName; @JsonProperty("AccountNumber") private String accountNumber; }
2. 在主模型中添加嵌套属性
修改ColumnNameForTheDBImImportingTo类,加入BusinessInformation类型的属性,并用@JsonProperty指定JSON键名:
package model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @AllArgsConstructor @NoArgsConstructor @Builder @JsonIgnoreProperties(ignoreUnknown = true) public class ColumnNameForTheDBImImportingTo implements Serializable { @JsonProperty("Original") private String original; @JsonProperty("SubmitterNetworkName") private String submitterNetworkName; @JsonProperty("SourceName") private String sourceName; @JsonProperty("SourceKind") private String sourceKind; // 新增嵌套属性,对应目标JSON中的BusinessInformation节点 @JsonProperty("BusinessInformation") private BusinessInformation businessInformation; @JsonProperty("EmployeeName") private String employeeName; @JsonProperty("EmployeeDOB") private String employeeDOB; }
3. 在Service中构建嵌套对象
修改主对象的构建方法,同时创建并注入BusinessInformation实例:
private ColumnNameForTheDBImImportingTo buildTargetModel() { // 构建嵌套的业务信息对象,这里可以替换为从数据库查询到的实际值 BusinessInformation businessInfo = BusinessInformation.builder() .businessContactName(null) .accountNumber(null) .build(); // 构建主对象并绑定嵌套属性 return ColumnNameForTheDBImImportingTo.builder() .original("Web Form") .submitterNetworkName("null") .sourceName("Contact Request Form") .sourceKind("Web Form") .businessInformation(businessInfo) .employeeName(null) .employeeDOB(null) .build(); }
4. 优化ObjectMapper的使用
避免每次序列化都创建新的ObjectMapper,直接使用Spring自动配置的单例实例:
import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; import twc.batch.extcbk.model.*; import java.io.IOException; @Component @Slf4j public class ColumnNameForTheDBImImportingToService { @Autowired private ObjectMapper objectMapper; private String getTargetModelJson(ColumnNameForTheDBImImportingTo targetModel) { try { String jsonStr = objectMapper.writeValueAsString(targetModel); log.debug("Generated JSON: {}", jsonStr); return jsonStr; } catch (IOException e) { log.error("Failed to serialize model to JSON: {}", e.getMessage()); return null; } } }
关键注意事项
- 统一使用
com.fasterxml.jackson系列依赖,不要混用org.codehaus的旧版本,避免序列化异常。 - 如果需要从数据库映射字段到嵌套对象,只需在构建
BusinessInformation时,将查询到的字段值赋值给对应属性即可。 - 使用Lombok的
@Builder注解可以大幅简化嵌套对象的构建代码,避免繁琐的setter调用。
内容的提问来源于stack exchange,提问作者jonas
相关产品推荐
相关产品推荐

