dubbo fastJson

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

相關文章
相關標籤/搜索