将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文本:
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类
java
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
java
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
注解或自定义反序列化逻辑。