dubbo fastJson

原创
2016/05/31 16:02
阅读数 467

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的转换。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部