接到一个需求,Java后台接到前台的请求后,要转为另一个格式存储,具体如下
前台的请求:
[{"id":"1","name":"张三"},{"id":"2","name":"李四"},{"id":"3","name":"王五"}]
转为另一个格式存到数据库:(不要问为什么,问就是历史原因,而且要保持这种顺序 0...0)
[{"id":"1","name":"张三"},{"name":"李四","id":"2"},{"name":"王五","id":"3"}]
首先解析前台的请求,新建一个PersonDto来映射请求的字段
@Data
public class PersonDto implements Serializable {
String id;
String name;
}
实现类:(省略main方法)
String request = "[{\"id\":\"1\",\"name\":\"张三\"},{\"id\":\"2\",\"name\":\"李四\"},{\"id\":\"3\",\"name\":\"王五\"}]";
ObjectMapper mapper = new ObjectMapper();
List<PersonDto> personDtoList = mapper.readValue(request, new TypeReference<List<PersonDto>>() {});
for (PersonDto personDto : personDtoList) {
System.out.println("[\"personDto\"] = " + personDto);
}
代码输出结果如下:
["personDto"] = PersonDto(id=1, name=张三)
["personDto"] = PersonDto(id=2, name=李四)
["personDto"] = PersonDto(id=3, name=王五)
但是问题来了:如果我直接输出,就达不到需求的结果
String response = mapper.writeValueAsString(personDtoList);
System.out.println("[\"response\"] = " + response);
结果输出:
["response"] = [{"id":"1","name":"张三"},{"id":"2","name":"李四"},{"id":"3","name":"王五"}]
后面思考了一段时间,为啥不适用多态试一下呢?
创建ResponseDto类
@Data
public class ResponseDto implements Serializable {
}
创建子类(正序子类)
@EqualsAndHashCode(callSuper = true)
@Data
public class ResponseAscDto extends ResponseDto{
String id;
String name;
}
创建子类(逆序子类)
@EqualsAndHashCode(callSuper = true)
@Data
public class ResponseDescDto extends ResponseDto{
String name;
String id;
}
实现类:(省略main方法)
String request = "[{\"id\":\"1\",\"name\":\"张三\"},{\"id\":\"2\",\"name\":\"李四\"},{\"id\":\"3\",\"name\":\"王五\"}]";
ObjectMapper mapper = new ObjectMapper();
List<PersonDto> personDtoList = mapper.readValue(request, new TypeReference<List<PersonDto>>() {
});
List<ResponseDto> responseDtoList = new ArrayList<>();
//单独处理第一个,用顺序ResponseAscDto来接收
PersonDto personDto = personDtoList.get(0);
ResponseDto responseDto = mapper.readValue(mapper.writeValueAsString(personDto), ResponseAscDto.class);
//添加到父类集合
responseDtoList.add(responseDto);
//处理后面几个,ResponseDescDto来接收
for (int i = 1; i < personDtoList.size(); i++) {
ResponseDto responseDescDto = mapper.readValue(mapper.writeValueAsString(personDtoList.get(i)), ResponseDescDto.class);
//添加到父类集合
responseDtoList.add(responseDescDto);
}
//通过父类List集合一次性输出
String response = mapper.writeValueAsString(responseDtoList);
System.out.println("[\"response\"] = " + response);
代码输出结果如下:
["response"] = [{"id":"1","name":"张三"},{"name":"李四","id":"2"},{"name":"王五","id":"3"}]