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"}]
原创粉丝点击