Dto创建的toString方法不继承Object 的toString方法或者使用原生的复合对象的toString方法(其实也是最终使用Object的toString方法)
每一个dto创建一个默认的toString方法:(两种实现方案)
1、创建一个默认的BaseDto对象,在BaseDTO中创建toString方法
2、在各个dto对象或者javaBean对象中创建toString方法
toString方法创建案例
本方法中使用fashJson-1.1.37.jar提供的com.alibaba.fastjson.JSONObject进行dto和json字符串直接转换。
com.alibaba.fastjson.JSONObject对象转换有点:
1、支持对象无序列化json、dto互转;
下面看代码(这里我采用了BaseDto来进行创建toString方法)
BaseDTO类:
根据BaseDTO类我创建了User对象和UserDTO对象,不需要对两个对象进行serial序列号:
User:
package com.sinosafe.macaw.test.dto;
import com.sinosafe.macaw.test.BaseDTO;
public class User extends BaseDTO{
private String userId;
private String userName;
private String passWord;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
UserVo对象:
package com.sinosafe.macaw.test.vo;
import com.sinosafe.macaw.test.BaseDTO;
public class UserVo extends BaseDTO{
private String userId;
private String userName;
private String passWord;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
对象创建好了,我们先一个测试方法,这里对象转换不需要做单元测试的考虑或者上下文加载,所以我直接使用main方法了:
package com.sinosafe.macaw.test;
import com.alibaba.fastjson.JSONObject;
import com.sinosafe.macaw.test.dto.User;
import com.sinosafe.macaw.test.vo.UserVo;
public class JSONTest {
public static void main(String[] args) {
User user = new User();
//user.setOld(123);
user.setPassWord("123456");
user.setUserId("123");
user.setUserName("yusha223");
String userJson = user.toString();
System.out.println(userJson);
UserVo user1 = JSONObject.parseObject(userJson, UserVo.class);
String user1Json = user1.toString();
System.out.println("user1 ->"+user1Json);
// UserInfo userInfo = JSONObject.parseObject(user1Json, UserInfo.class);
// String userInfoS = userInfo.toString();
// System.out.println(" userInfo ->"+userInfoS);
}
}
测试输出结果:
我们没有对User和UserVo进行序列化定义,但是我们可以成功的将user的String对象转化为对象userVo。
2、支持对象属性少的dto转属性多的dto;
3、支持对象属性多的dto转属性少的dto;
我们在user 对象中新增一个old属性:
package com.sinosafe.macaw.test.dto;
import com.sinosafe.macaw.test.BaseDTO;
/**
*
* @author yusha
* TODO
*/
public class User extends BaseDTO{
private String userId;
private String userName;
private String passWord;
private int old;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public int getOld() {
return old;
}
public void setOld(int old) {
this.old = old;
}
}
我们再来看看是否可以成功转化,依然使用上面的测试方法:
package com.sinosafe.macaw.test;
import com.alibaba.fastjson.JSONObject;
import com.sinosafe.macaw.test.dto.User;
import com.sinosafe.macaw.test.vo.UserVo;
public class JSONTest {
public static void main(String[] args) {
User user = new User();
user.setOld(123);
user.setPassWord("123456");
user.setUserId("123");
user.setUserName("yusha223");
String userJson = user.toString();
System.out.println("user is ->"+userJson);
UserVo user1 = JSONObject.parseObject(userJson, UserVo.class);
String user1Json = user1.toString();
System.out.println("user1 ->"+user1Json);
// UserInfo userInfo = JSONObject.parseObject(user1Json, UserInfo.class);
// String userInfoS = userInfo.toString();
// System.out.println(" userInfo ->"+userInfoS);
}
}
大家注意到,我们对user对象新set的Old属性值为123
我们现在来看执行结果怎样的
执行结果中我们看到,在userVo中并没有old属性。而且也成功转换成功,所以JSONObject支持对象之间属性多的dto转换为属性少的dto。这里有一个疑问,如果我们把userVo 对象再转换回去,是否user对象中old的值还保留着呢。
我修改一下测试方法:
import com.alibaba.fastjson.JSONObject;
import com.sinosafe.macaw.test.dto.User;
import com.sinosafe.macaw.test.vo.UserVo;
public class JSONTest {
public static void main(String[] args) {
User user = new User();
user.setOld(123);
user.setPassWord("123456");
user.setUserId("123");
user.setUserName("yusha223");
String userJson = user.toString();
System.out.println("user is ->"+userJson);
UserVo user1 = JSONObject.parseObject(userJson, UserVo.class);
String user1Json = user1.toString();
System.out.println("user1 ->"+user1Json);
User user2 = JSONObject.parseObject(user1Json, User.class);
System.out.println("User user2->"+user2.toString());
// UserInfo userInfo = JSONObject.parseObject(user1Json, UserInfo.class);
// String userInfoS = userInfo.toString();
// System.out.println(" userInfo ->"+userInfoS);
}
}
执行结果
这里我们看到user2对象的old值已经不是原来设置的123了,而是变成了默认的0,这里还要说明一点,如果属性是String的,JSONObject转换为json字符串的时候,会直接将String属性忽略掉。
所以在使用JSONObject对象传递数据的时候,如果存在DTO属性信息不一致的情况,会出现信息的丢失的情况,这里需要特别注意。
4、在dubbo传输过程中,我们当然不是只需要传输单个对象,我们很多时候需要传输list对象、map等数据。那么在dubbo传参的时候应该怎么写呢,这里我们依然使用统一的JSONObject来进行处理。
我们构建一个包含User对象的List,并转换为包含UserVo的List对象。
package com.sinosafe.macaw.test;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSONObject;
import com.sinosafe.macaw.test.dto.User;
import com.sinosafe.macaw.test.vo.UserVo;
public class JSONTest {
public static void main(String[] args) {
// String userJson = user.toString();
// System.out.println("user is ->"+userJson);
// UserVo user1 = JSONObject.parseObject(userJson, UserVo.class);
// String user1Json = user1.toString();
// System.out.println("user1 ->"+user1Json);
// User user2 = JSONObject.parseObject(user1Json, User.class);
// System.out.println("User user2->"+user2.toString());
List<User> userList = new ArrayList<User>();
for (int i=0;i<4;i++){
User user = new User();
user.setOld(i);
user.setPassWord("123456"+i);
user.setUserId("123"+i);
user.setUserName("yusha223"+i);
userList.add(user);
}
System.out.println("userList to String is ->"+userList.toString());
System.out.println("userList use JSONObject to jsonString is ->"+JSONObject.toJSONString(userList));
Object temp = userList;
List<Object> tempList = (List<Object>) temp;
List<UserVo> uservoList = new ArrayList<UserVo>();
for(Object o :tempList){
String ObjectJson = JSONObject.toJSONString(o);
UserVo vo = JSONObject.parseObject(ObjectJson, UserVo.class);
String voString = vo.toString();
System.out.println("vo is->"+voString);
uservoList.add(vo);
}
System.out.println("convert to userVo list is->"+uservoList);
List<UserVo> uservoList1 =JSONObject.parseArray(temp.toString(), UserVo.class);
System.out.println("conver to userVo list by parseArray ->"+uservoList1);
}
}
代码中加注黄色部分代码,主要是为了更加真实的模拟dubbo服务接受到的参数时,需要进行的转换过程。
我们下面来看看执行的结果如何:
userList to String is ->[{"old":0,"passWord":"1234560","userId":"1230","userName":"yusha2230"}, {"old":1,"passWord":"1234561","userId":"1231","userName":"yusha2231"}, {"old":2,"passWord":"1234562","userId":"1232","userName":"yusha2232"}, {"old":3,"passWord":"1234563","userId":"1233","userName":"yusha2233"}]
userList use JSONObject to jsonString is ->[{"old":0,"passWord":"1234560","userId":"1230","userName":"yusha2230"},{"old":1,"passWord":"1234561","userId":"1231","userName":"yusha2231"},{"old":2,"passWord":"1234562","userId":"1232","userName":"yusha2232"},{"old":3,"passWord":"1234563","userId":"1233","userName":"yusha2233"}]
vo is->{"passWord":"1234560","userId":"1230","userName":"yusha2230"}
vo is->{"passWord":"1234561","userId":"1231","userName":"yusha2231"}
vo is->{"passWord":"1234562","userId":"1232","userName":"yusha2232"}
vo is->{"passWord":"1234563","userId":"1233","userName":"yusha2233"}
convert to userVo list is->[{"passWord":"1234560","userId":"1230","userName":"yusha2230"}, {"passWord":"1234561","userId":"1231","userName":"yusha2231"}, {"passWord":"1234562","userId":"1232","userName":"yusha2232"}, {"passWord":"1234563","userId":"1233","userName":"yusha2233"}]
conver to userVo list by parseArray ->[{"passWord":"1234560","userId":"1230","userName":"yusha2230"}, {"passWord":"1234561","userId":"1231","userName":"yusha2231"}, {"passWord":"1234562","userId":"1232","userName":"yusha2232"}, {"passWord":"1234563","userId":"1233","userName":"yusha2233"}]
可以看到在代码
System.out.println("userList to String is ->"+userList.toString());
System.out.println("userList use JSONObject to jsonString is ->"+JSONObject.toJSONString(userList));
中我们看到list对象和使用JSONObject打印出来的结果是一样的,这是因为在list中对象转换为string的时候,直接调用了我们DTO中定义的toString方法,而不是Object的toString方法。
我们再回过来看我们list使用JSONObject后的结果,同样的只是简单的对单个对象进行转换。
同时还可以直接使用JSONObject对象提供的parseArray方法进行list的转换。