json文本怎么转DTO

将JSON文本转换为DTO(Data Transfer Object)通常涉及以下几个步骤:

  1. 定义DTO类:首先,根据JSON结构定义相应的Java类,这些类应包含与JSON字段对应的属性和相应的getter和setter方法。

  2. 使用JSON处理库:使用如Jackson或Gson等JSON处理库来解析JSON文本并将其映射到DTO对象。

  3. 处理嵌套对象和数组:如果JSON中包含嵌套对象或数组,需要在DTO类中定义相应的嵌套类或集合类型。

  4. 考虑日期和时间格式 :如果JSON中包含日期和时间,需要确保DTO类中的相应字段类型为LocalDateTimeLocalDateOffsetDateTime等,并使用适当的格式注解。

  5. 处理可选字段和空值 :使用@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注解或自定义反序列化逻辑。

相关推荐
code小毛孩19 分钟前
如何简单的并且又能大幅度降低任务队列的锁粒度、提高吞吐量?
java·jvm·数据库
你不是我我26 分钟前
【Java开发日记】请介绍类加载过程,什么是双亲委派模型?
java·开发语言
牢七33 分钟前
java10
java
阿挥的编程日记40 分钟前
基于SpringBoot的高校(学生综合)服务平台的设计与实现
java·spring boot·后端·spring·mybatis
小霞在敲代码43 分钟前
ArrayList - 数据结构 - 数组
java·索引
一个小白开发2 小时前
ip获取城市省份信息
java·tcp/ip
豆沙沙包?2 小时前
2025年--Lc170--H289. 生命游戏(矩阵)--Java版
java·游戏·矩阵
冬夜戏雪2 小时前
[学习日记][springboot 1-7][leetcode 6道]
java·开发语言·学习
讓丄帝愛伱2 小时前
idea 中 mapper.xml黄线警告怎么去掉
java·intellij-idea
桦说编程3 小时前
线程池拒绝策略避坑:谨慎使用抛弃策略,可能导致系统卡死
java·后端