fastjson反序列化和webservice的理解
来源:互联网 发布:美国法学院top14知乎 编辑:程序博客网 时间:2024/06/04 18:29
认识到你Controller里调用的webservice的方法,都不是直接的调用,其实在Impl类里进行了加工,返回对象
parseObject(jsonString)反序列化的过程是先看成员变量的set方法有没有@JsonField(name = "")的注解,没有的话,直接找成员变量(忽略首字母大小写,即首字母是大写,也可以匹配到小写的成员变量,序列化成功)
如果有该注解,则按该注解的name在成员变量里匹配,没匹配上的属性,就不会反序列化到实体类里
1.getUserInfo可以查询到用户下的SiteKey信息
2.webService.getUserSiteInfo(user.getUserid(), siteKey);可以拿到如下的一条记录(包含了siteId,siteName,Type)
[
{
"SiteId": "Customer_S3_000012_100_s2000001",
"SiteName": "王者荣耀",
"Type": "100",
"Area": "",
"StaffNo": "",
"OpenDate": "",
"BuildDate": "",
"CityId": "",
"provinceid": "",
"areaid": "",
"SiteStaus": "1",
"Brand": "",
"Format": "",
"CustomerId": "Customer_S3_000012",
"Parent100": "",
"Parent200": "",
"Parent300": "",
"Parent400": "",
"Parent500": "",
"Parent600": ""
}
]
//根据webservice接口获取siteKey
com.winner.kl.entity.User userInfo = webService.getUserInfo(user.getUserid());
"siteKey":Customer_S3_000012_100_s2000001,Customer_S3_000012_300_s2000001,Customer_S3_000012_300_s2000002
"status":success
String[] siteKeyArr = userInfo.getSitekey().split(",");//获取用户下的siteKey信息
List<SiteList> siteLists = webService.getSiteByKeyword(user.getUserid(), null, null, null);//传入用户的userid
直接在WebServiceAPIImpl调用返回的result结果String result = shopService.getSiteByKeyword(userId, keyWord, siteType, siteKey);
[{"SiteId":"Customer_S3_000009_100_s2000001","SiteName":"喔喔喔","Type":"100"},{"SiteId":"Customer_S3_000009_300_s2000001","SiteName":"坚果手机旗舰店","Type":"300"}]
//这个SiteList类里面的成员变量除了SiteId SiteName Type还有其他的,但在WebServiceAPIImpl里返回值result只有SiteId SiteName Type,故而反序列化也只有这三个属性进入SiteList这个类里
List<SiteList> getSiteLists = JSON.parseArray(result, SiteList.class);
为了查看这个getSiteLists,将其转换为如下json 多个"status":"success",原因是继承了SiteList继承了Resp
[{"siteId":"Customer_S3_000012_100_s2000001","siteName":"王者荣耀","status":"success","type":100},{"siteId":"Customer_S3_000012_300_s2000001","siteName":"腾讯科技成都分公司","status":"success","type":300}]
public class SiteList extends Resp {
private String siteId;
private String siteName;
private Integer type;
private Double area;
private Integer staffNo;
private String openDate;
private String buildDate;
private String cityId;
private String provinceId;
private String areaId;
一般在serviceImpl直接用,进行加工后,返回对象.
public List<SiteList> getSiteByKeyword(String userId, String keyWord, String siteType, String siteKey) {
String result = shopService.getSiteByKeyword(userId, keyWord, siteType, siteKey);//返回值如下
[{"SiteId":"Customer_S3_000012_100_s2000001","SiteName":"王者荣耀","Type":"100"},{"SiteId":"Customer_S3_000012_300_s2000001","SiteName":"腾讯科技成都分公司","Type":"300"}]
List<Object> params = new ArrayList<>();
params.add(userId);
params.add(keyWord);
params.add(siteType);
params.add(siteKey);
List<SiteList> getSiteLists = Lists.newArrayList();
if (!Strings.isNullOrEmpty(result)) {
getSiteLists = JSON.parseArray(result, SiteList.class);
}
writeLog(loggerShopService, "getSiteByKeyword", params, result);
return getSiteLists;
}
又写了这么一个User类 在site方法加注解name="Site" 将webservice返回的内容的Site:后逗号隔开的多个siteKey封装进区
public class User extends Resp implements Serializable {
private String sitekey;
public String getSitekey() {
return sitekey;
}
@JSONField(name="Site")//这个注解 就是json转为实体类时,json中字符串里找Site,或成员变量里有site,有的话就将json中的Site信息就封装到成员变量sitekey里了,因为这个webService.getUserInfo(user.getUserid());返回的是User对象,再通过这个(name="Site")的注解,将
public void setSitekey(String sitekey) {
this.sitekey = sitekey;
}
}
我们来看下实现类:用以借鉴,以后你调用别人的接口,拿到的json字符串,可以用Json.parseObject转为map选择性使用json;也可以建造一个实体类,在你要用的json属性的set方法加注解来选择性将你需要json的某一部分转成实体类,从而使用.
public com.winner.kl.entity.User getUserInfo(String userId) {
String result = accountService.getUserInfo(userId);
if (!Strings.isNullOrEmpty(result)) {
List<com.winner.kl.entity.User> users = JSON.parseArray(result, com.winner.kl.entity.User.class);
//因为有(name="Site")的注解,所以只将Site:后面的反序列化到User类里
return users.get(0);
} else {
return null;
}
}
getUserInfo(userid)返回值
[
{
"RoleId": "c93f5d2e-609c-11e7-8cb8-000c29b43f47",
"RoleName": "老板",
"UserId": "c940b837-609c-11e7-8cb8-000c29b43f47",
"UserName": "18291891512",
"Password": "e10adc3949ba59abbe56e057f20f883e",
"Site": "Customer_S3_000012_100_s2000001,Customer_S3_000012_300_s2000001,Customer_S3_000012_300_s2000002",
"Data": "1,2,3,4,5,6,7,8,9",
"Remark": "",
"RealName": "马化腾",
"Mail": "",
"Tel": "",
"Mobile": "18291891512",
"IsLockedOut": "0"
}
]
[{"siteId":"Customer_S3_000009_100_s2000001","siteName":"喔喔喔","status":"success","type":100},{"siteId":"Customer_S3_000009_300_s2000001","siteName":"坚果手机旗舰店","status":"success","type":300},{"siteId":"Customer_S3_000009_300_s2000002","siteName":"锤子T系列直营店","status":"success","type":300}]
String result = webService.getUserSiteInfo(user.getUserid(), siteKey);
AddUser
[{"RoleId":"","UserName":"客户B","PassWord":"e10adc3949ba59abbe56e057f20f883e","Site":"","Data":"1","Remark":"","RealName":"集团B"," Mail":"","Tel":"22222222222","Mobile":"22222222222","IsLockedOut":0,"Customername":"集团B"}]
[{
"status":"1",
"msg":"{
"userid":"546e0ab3-231e-11e7-a1b3-c81f662bac14",
"customerid":"Customer_S3_000005",
"groupid":"Customer_S3_000005_100_s2000001",
"userroleid":"546bd05b-231e-11e7-a1b3-c81f662bac14",
"roles":[
{"rolename":"老板","roleid":"546bd05b-231e-11e7-a1b3-c81f662bac14"},
{"rolename":"店长","roleid":"546bd07d-231e-11e7-a1b3-c81f662bac14"},
{"rolename":"店员","roleid":"546bd08e-231e-11e7-a1b3-c81f662bac14"},
{"rolename":"IT","roleid":"546bd0a6-231e-11e7-a1b3-c81f662bac14"}]
}"
}
]
AddSite
[{"CustomerId":"Customer_S3_000005","Type":"200","SiteName":"场所B_200_1","StaffNo":"2","Address":"河北保定","OpenDate":"20170123","Area":"50","countryid":"1","provinceid":"130000","CityId":"130600","Parent100":"Customer_S3_000005_100_s2000001"}]
[{"status":"1","msg":"Customer_S3_000005_200_s2000001"}]
parseObject(jsonString)反序列化的过程是先看成员变量的set方法有没有@JsonField(name = "")的注解,没有的话,直接找成员变量(忽略首字母大小写,即首字母是大写,也可以匹配到小写的成员变量,序列化成功)
如果有该注解,则按该注解的name在成员变量里匹配,没匹配上的属性,就不会反序列化到实体类里
1.getUserInfo可以查询到用户下的SiteKey信息
2.webService.getUserSiteInfo(user.getUserid(), siteKey);可以拿到如下的一条记录(包含了siteId,siteName,Type)
[
{
"SiteId": "Customer_S3_000012_100_s2000001",
"SiteName": "王者荣耀",
"Type": "100",
"Area": "",
"StaffNo": "",
"OpenDate": "",
"BuildDate": "",
"CityId": "",
"provinceid": "",
"areaid": "",
"SiteStaus": "1",
"Brand": "",
"Format": "",
"CustomerId": "Customer_S3_000012",
"Parent100": "",
"Parent200": "",
"Parent300": "",
"Parent400": "",
"Parent500": "",
"Parent600": ""
}
]
//根据webservice接口获取siteKey
com.winner.kl.entity.User userInfo = webService.getUserInfo(user.getUserid());
"siteKey":Customer_S3_000012_100_s2000001,Customer_S3_000012_300_s2000001,Customer_S3_000012_300_s2000002
"status":success
String[] siteKeyArr = userInfo.getSitekey().split(",");//获取用户下的siteKey信息
List<SiteList> siteLists = webService.getSiteByKeyword(user.getUserid(), null, null, null);//传入用户的userid
直接在WebServiceAPIImpl调用返回的result结果String result = shopService.getSiteByKeyword(userId, keyWord, siteType, siteKey);
[{"SiteId":"Customer_S3_000009_100_s2000001","SiteName":"喔喔喔","Type":"100"},{"SiteId":"Customer_S3_000009_300_s2000001","SiteName":"坚果手机旗舰店","Type":"300"}]
//这个SiteList类里面的成员变量除了SiteId SiteName Type还有其他的,但在WebServiceAPIImpl里返回值result只有SiteId SiteName Type,故而反序列化也只有这三个属性进入SiteList这个类里
List<SiteList> getSiteLists = JSON.parseArray(result, SiteList.class);
为了查看这个getSiteLists,将其转换为如下json 多个"status":"success",原因是继承了SiteList继承了Resp
[{"siteId":"Customer_S3_000012_100_s2000001","siteName":"王者荣耀","status":"success","type":100},{"siteId":"Customer_S3_000012_300_s2000001","siteName":"腾讯科技成都分公司","status":"success","type":300}]
public class SiteList extends Resp {
private String siteId;
private String siteName;
private Integer type;
private Double area;
private Integer staffNo;
private String openDate;
private String buildDate;
private String cityId;
private String provinceId;
private String areaId;
一般在serviceImpl直接用,进行加工后,返回对象.
public List<SiteList> getSiteByKeyword(String userId, String keyWord, String siteType, String siteKey) {
String result = shopService.getSiteByKeyword(userId, keyWord, siteType, siteKey);//返回值如下
[{"SiteId":"Customer_S3_000012_100_s2000001","SiteName":"王者荣耀","Type":"100"},{"SiteId":"Customer_S3_000012_300_s2000001","SiteName":"腾讯科技成都分公司","Type":"300"}]
List<Object> params = new ArrayList<>();
params.add(userId);
params.add(keyWord);
params.add(siteType);
params.add(siteKey);
List<SiteList> getSiteLists = Lists.newArrayList();
if (!Strings.isNullOrEmpty(result)) {
getSiteLists = JSON.parseArray(result, SiteList.class);
}
writeLog(loggerShopService, "getSiteByKeyword", params, result);
return getSiteLists;
}
又写了这么一个User类 在site方法加注解name="Site" 将webservice返回的内容的Site:后逗号隔开的多个siteKey封装进区
public class User extends Resp implements Serializable {
private String sitekey;
public String getSitekey() {
return sitekey;
}
@JSONField(name="Site")//这个注解 就是json转为实体类时,json中字符串里找Site,或成员变量里有site,有的话就将json中的Site信息就封装到成员变量sitekey里了,因为这个webService.getUserInfo(user.getUserid());返回的是User对象,再通过这个(name="Site")的注解,将
public void setSitekey(String sitekey) {
this.sitekey = sitekey;
}
}
我们来看下实现类:用以借鉴,以后你调用别人的接口,拿到的json字符串,可以用Json.parseObject转为map选择性使用json;也可以建造一个实体类,在你要用的json属性的set方法加注解来选择性将你需要json的某一部分转成实体类,从而使用.
public com.winner.kl.entity.User getUserInfo(String userId) {
String result = accountService.getUserInfo(userId);
if (!Strings.isNullOrEmpty(result)) {
List<com.winner.kl.entity.User> users = JSON.parseArray(result, com.winner.kl.entity.User.class);
//因为有(name="Site")的注解,所以只将Site:后面的反序列化到User类里
return users.get(0);
} else {
return null;
}
}
getUserInfo(userid)返回值
[
{
"RoleId": "c93f5d2e-609c-11e7-8cb8-000c29b43f47",
"RoleName": "老板",
"UserId": "c940b837-609c-11e7-8cb8-000c29b43f47",
"UserName": "18291891512",
"Password": "e10adc3949ba59abbe56e057f20f883e",
"Site": "Customer_S3_000012_100_s2000001,Customer_S3_000012_300_s2000001,Customer_S3_000012_300_s2000002",
"Data": "1,2,3,4,5,6,7,8,9",
"Remark": "",
"RealName": "马化腾",
"Mail": "",
"Tel": "",
"Mobile": "18291891512",
"IsLockedOut": "0"
}
]
[{"siteId":"Customer_S3_000009_100_s2000001","siteName":"喔喔喔","status":"success","type":100},{"siteId":"Customer_S3_000009_300_s2000001","siteName":"坚果手机旗舰店","status":"success","type":300},{"siteId":"Customer_S3_000009_300_s2000002","siteName":"锤子T系列直营店","status":"success","type":300}]
String result = webService.getUserSiteInfo(user.getUserid(), siteKey);
AddUser
[{"RoleId":"","UserName":"客户B","PassWord":"e10adc3949ba59abbe56e057f20f883e","Site":"","Data":"1","Remark":"","RealName":"集团B"," Mail":"","Tel":"22222222222","Mobile":"22222222222","IsLockedOut":0,"Customername":"集团B"}]
[{
"status":"1",
"msg":"{
"userid":"546e0ab3-231e-11e7-a1b3-c81f662bac14",
"customerid":"Customer_S3_000005",
"groupid":"Customer_S3_000005_100_s2000001",
"userroleid":"546bd05b-231e-11e7-a1b3-c81f662bac14",
"roles":[
{"rolename":"老板","roleid":"546bd05b-231e-11e7-a1b3-c81f662bac14"},
{"rolename":"店长","roleid":"546bd07d-231e-11e7-a1b3-c81f662bac14"},
{"rolename":"店员","roleid":"546bd08e-231e-11e7-a1b3-c81f662bac14"},
{"rolename":"IT","roleid":"546bd0a6-231e-11e7-a1b3-c81f662bac14"}]
}"
}
]
AddSite
[{"CustomerId":"Customer_S3_000005","Type":"200","SiteName":"场所B_200_1","StaffNo":"2","Address":"河北保定","OpenDate":"20170123","Area":"50","countryid":"1","provinceid":"130000","CityId":"130600","Parent100":"Customer_S3_000005_100_s2000001"}]
[{"status":"1","msg":"Customer_S3_000005_200_s2000001"}]
阅读全文
0 0
- fastjson反序列化和webservice的理解
- fastjson 远程反序列化poc的构造和分析
- fastjson反序列化
- FastJson解析实例--对象序列化和反序列化
- 用fastjson将数据序列化和反序列化给jfinal的model的方案
- fastjson使用(六) -- 序列化和反序列化的时候日期处理
- fastJson序列化和反序列化 中空字符串的处理
- Fastjson使用 -- 序列化和反序列化的时候日期处理
- 跟我撩fastjson-第三章:Java泛型的序列化和反序列化
- 用fastjson反序列化 带泛型的类
- fastjson反序列化ZonedDateTime格式的时间
- 序列化和反序列化的简单理解
- 对序列化和反序列化的理解
- 序列化和反序列化的简单理解
- 序列化和反序列化的简单理解
- 序列化和反序列化的简单理解
- 序列化和反序列化的简单理解
- 序列化和反序列化的简单理解
- CentOS 6.5安装Erlang及RabbitMQ
- 04构建一个网站测试计划
- poj2954-Triangle 求三角形的面积(已知三角形三点求面积)
- eclipse 使用NDK插件并支持NDK调试(DEBUG)
- Caffe源码(二):blob 分析
- fastjson反序列化和webservice的理解
- AngularJS指令参数详解
- Java并发编程-无锁CAS与Unsafe类及其并发包Atomic
- 计算两向量的欧式距离,余弦相似度
- The CATALINA_HOME environment variable is not defined correctly
- 类前面有红叉
- [1]java微信开发-准备工作
- wechat and alipay QRCode
- sqlite整合spring,springmvc