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)])]