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的轉換。