Java多态的一种思考与实现

接到一个需求,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"}]

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值