将JSON文本转换为DTO(Data Transfer Object)通常涉及以下几个步骤:
-
定义DTO类:首先,根据JSON结构定义相应的Java类,这些类应包含与JSON字段对应的属性和相应的getter和setter方法。
-
使用JSON处理库:使用如Jackson或Gson等JSON处理库来解析JSON文本并将其映射到DTO对象。
-
处理嵌套对象和数组:如果JSON中包含嵌套对象或数组,需要在DTO类中定义相应的嵌套类或集合类型。
-
考虑日期和时间格式:如果JSON中包含日期和时间,需要确保DTO类中的相应字段类型为
LocalDateTime
、LocalDate
或OffsetDateTime
等,并使用适当的格式注解。 -
处理可选字段和空值:使用
@Nullable
注解或Java 8的Optional
类来处理可能为null的字段。
示例
假设有以下JSON文本:
{"id": "310970","name": "营销系统人力资源部","parentId": "311088","departmentLevel": "50","idPath": "/200000/311088/310970/","namePath": "/xxx/人力资源系统/营销系统人力资源部/","levelPath": "/10/30/50/","status": "0","departmentDesc": "L3","departmentCreatedAt": 1527782400000,"effectiveDateTime": 1527782400000,"leader": "80036462","channel": "CORE_HR","updatedAt": 1692675765000,"isEntity": "Y","deptType": "1","setId": "xxx","departmentSeq": "520","nameEn": "NONE(invalid)","nameEnPath": "/xxx/HR System/NONE(invalid)/","departmentDescEn": "","isModel": "","locations": [{"deptId": "310970","countryCode": "CHN","countryDesc": "中国","countryDescEn": "China","cityCode": "440300","cityDesc": "深圳市","cityDescEn": "","updatedAt": 1672141857000}],"departmentCreatedAtStr": "2018-06-01 00:00:00","effectiveDateTimeStr": "2018-06-01 00:00:00","updatedAtStr": "2023-08-22 11:42:45"
}
定义DTO类
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.time.LocalDateTime;
import java.util.List;public class DepartmentInfoDTO {private String id;private String name;private String parentId;private String departmentLevel;private String idPath;private String namePath;private String levelPath;private String status;private String departmentDesc;@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime departmentCreatedAt;@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime effectiveDateTime;@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updatedAt;private String leader;private String channel;private String isEntity;private String deptType;private String setId;private String departmentSeq;private String nameEn;private String nameEnPath;private String departmentDescEn;private String isModel;private List<LocationDTO> locations;private String departmentCreatedAtStr;private String effectiveDateTimeStr;private String updatedAtStr;// Getters and setters
}public static class LocationDTO {private String deptId;private String countryCode;private String countryDesc;private String countryDescEn;private String cityCode;private String cityDesc;private String cityDescEn;@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updatedAt;// Getters and setters
}
使用Jackson解析JSON
import com.fasterxml.jackson.databind.ObjectMapper;public class JsonToDtoConverter {public static void main(String[] args) {String jsonText = "{\"id\":\"310970\",\"name\":\"营销系统人力资源部(失效)\",...}"; // 完整的JSON文本ObjectMapper objectMapper = new ObjectMapper();try {DepartmentInfoDTO departmentInfo = objectMapper.readValue(jsonText, DepartmentInfoDTO.class);// 现在 departmentInfo 对象包含了JSON数据} catch (Exception e) {e.printStackTrace();}}
}
确保处理任何可能的异常,并根据需要调整DTO类和解析逻辑。如果JSON结构非常复杂或经常变化,考虑使用更灵活的解析策略,例如使用@JsonAnySetter
注解或自定义反序列化逻辑。