Dto建立的toString方法不继承Object 的toString方法或者使用原生的复合对象的toString方法(其实也是最终使用Object的toString方法)java
每个dto建立一个默认的toString方法:(两种实现方案)json
一、建立一个默认的BaseDto对象,在BaseDTO中建立toString方法单元测试
二、在各个dto对象或者javaBean对象中建立toString方法测试
toString方法建立案例this
本方法中使用fashJson-1.1.37.jar提供的com.alibaba.fastjson.JSONObject进行dto和json字符串直接转换。.net
com.alibaba.fastjson.JSONObject对象转换有点:对象
一、支持对象无序列化json、dto互转;继承
下面看代码(这里我采用了BaseDto来进行建立toString方法)字符串
BaseDTO类:get
根据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。
二、支持对象属性少的dto转属性多的dto;
三、支持对象属性多的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属性信息不一致的状况,会出现信息的丢失的状况,这里须要特别注意。
四、在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的转换。