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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:50:17