JAVA复杂对象与JSON的转换

1.背景

JSON可以用文本格式存储对象,比如前后端交互过程中传输DTO。现在我的需求是接收到的DTO中除了常见属性外,还有较复杂的List,甚至有多层List嵌套。这个字段除了save和retrieve外不做修改,也不会作为查询时的条件,所以为了方便起见,将整个list作为一个json存入数据库,MySQL5.7开始支持这一类型的栏位

2.工具

我使用的是阿里巴巴的fastjson作为JSON转换的工具

3.代码

3.1Entity

PersonEntity

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PersonEntity {
    private String name;
    private String age;
    private String works;
}

Person实体有姓名和年龄这两个常用属性,和works这个属性

3.2DTO

PersonDTO

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PersonDTO {
    private String name;
    @NotBlank
    private String age;
    @Valid
    @NotEmpty
    @JsonProperty("works")
    private List<WorkDTO> works;
}

PersonDTO中works为List,且类型为WorkDTO

WorkDTO

@Data
@NoArgsConstructor
@AllArgsConstructor
public class WorkDTO {
    @NotNull
    private String place;
    @Valid
    @NotEmpty
    @JsonProperty("activities")
    private List<ActivityDTO> activities;
}

WorkDTO中activity也是list

ActivityDTO

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ActivityDTO {
    public static final ActivityDTO NULL = new ActivityDTO("", 0);

    @NotNull
    private String alias;
    private Integer duration;
}

3.3准备数据

@Test
    void contextLoads() {
        PersonDTO personDTO = new PersonDTO();
        ArrayList<WorkDTO> workDTOS = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            WorkDTO workDTO = new WorkDTO();
            ArrayList<ActivityDTO> activityDTOS = new ArrayList<>();
            for (int j = 0; j < 3; j++) {
                ActivityDTO activityDTO = new ActivityDTO();
                activityDTO.setAlias("action:" + j);
                activityDTO.setDuration(j);
                activityDTOS.add(activityDTO);
            }
            workDTO.setPlace("place:" + i);
            workDTO.setActivities(activityDTOS);
            workDTOS.add(workDTO);
        }
        personDTO.setWorks(workDTOS);
        personDTO.setName("skye");
        personDTO.setAge("20");

        System.out.println("-----------------------------------------------------------------------------------------------------------");
        System.out.println("最初的personDTO:" + personDTO);
        System.out.println("最初的personDTO的works,应当为List<>:" + personDTO.getWorks());

        PersonEntity personEntity = personDTOToEntity(personDTO);
        System.out.println("-----------------------------------------------------------------------------------------------------------");
        System.out.println("personDTO转化为personEntity:" + personEntity);
        System.out.println("personDTO转化为personEntity的works,应当为String:" + personEntity.getWorks());

        PersonDTO personDTO1 = personEntityToDTO(personEntity);
        System.out.println("-----------------------------------------------------------------------------------------------------------");
        System.out.println("personEntity转化为personDTO1:" + personDTO1);
        System.out.println("personEntity转化为personDTO1的works,应当为List<>:" + personDTO1.getWorks());
    }

3.4转换方法

DTO TO ENTITY

    private PersonEntity personDTOToEntity(PersonDTO personDTO) {
        PersonEntity personEntity = new PersonEntity();
        personEntity.setName(personDTO.getName());
        personEntity.setAge(personDTO.getAge());
        //personEntity.setWorks(String.valueOf(personDTO.getWorks()));
        personEntity.setWorks(JSONArray.toJSONString(personDTO.getWorks()));
        return personEntity;
    }

将List转化为String的过程中不可以使用String.valueof,这个方法转化出来的String不是JSON格式

ENTITY TO DTO

    private PersonDTO personEntityToDTO(PersonEntity personEntity) {
        PersonDTO personDTO = new PersonDTO();
        personDTO.setName(personEntity.getName());
        personDTO.setAge(personEntity.getAge());
        List<WorkDTO> workDTOS = JSONArray.parseArray(personEntity.getWorks(),WorkDTO.class);
        personDTO.setWorks(workDTOS);
       return personDTO;
    }

JSONObject可以直接将JSON转化为List

4.结果

-----------------------------------------------------------------------------------------------------------
最初的personDTO:PersonDTO(name=skye, age=20, works=[WorkDTO(place=place:0, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:1, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:2, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:3, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:4, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)])])
最初的personDTO的works,应当为List<>:[WorkDTO(place=place:0, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:1, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:2, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:3, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:4, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)])]
-----------------------------------------------------------------------------------------------------------
personDTO转化为personEntity:PersonEntity(name=skye, age=20, works=[{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:0"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:1"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:2"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:3"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:4"}])
personDTO转化为personEntity的works,应当为String:[{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:0"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:1"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:2"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:3"},{"activities":[{"alias":"action:0","duration":0},{"alias":"action:1","duration":1},{"alias":"action:2","duration":2}],"place":"place:4"}]
-----------------------------------------------------------------------------------------------------------
personEntity转化为personDTO1:PersonDTO(name=skye, age=20, works=[WorkDTO(place=place:0, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:1, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:2, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:3, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:4, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)])])
personEntity转化为personDTO1的works,应当为List<>:[WorkDTO(place=place:0, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:1, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:2, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:3, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)]), WorkDTO(place=place:4, activities=[ActivityDTO(alias=action:0, duration=0), ActivityDTO(alias=action:1, duration=1), ActivityDTO(alias=action:2, duration=2)])]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

skye111321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值