后台对前台传入的json数据进行数据类型判断

本人在公司写项目接口的时候碰到测试给的一个问题,就是前台传入的json字符串到后台转换成实体类对象的时候没有做数据类型的判断,例如:![正、异常json示例](https://img-blog.csdn.net/20170721094238211?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUm9iaW5zU3RydWdnbGU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
也就是说,后台实体类中一个String类型数据可以存取前台json传入的任何数据,从而导致了将不合规范的数据存入了数据库。
这个问题我问了一下同事,他们都有出现了这个问题,本来想着看项目组长能不能写一个工具类进行数据类型的判断,但是想想还是自己想办法解决,在解决这个问题之前有参考了一些其他论坛或者博客上面的文章,例如:
http://blog.csdn.net/opopopwqwqwq/article/details/51926617
http://langmnm.iteye.com/blog/2078439
https://www.oschina.net/code/snippet_188676_16517
粗略的看了一下这些方法好像不能够解决这个问题,一个是需要引入架包,然后另一个的话只能对一些非空、长度范围做约束,好像并不能解决此类的问题。(本人职场小白,行业小白,懂的不太多,如果有说错的地方还望各位大神指出,感激不尽)后来自个想了一下,想出了一个通过JSONObject类来进行json数据类型判断的方法,话不多说,直接贴代码:
改造前:
    @RequestMapping(value="/login" ,method = RequestMethod.POST)
    public BaseResponse login(@RequestBody UserModel userModel){
        BaseResponse resp = new BaseResponse();
        try{
            resp.setSuccess(true);
            if(!userService.login(userModel)){
                resp.setSuccess(false);
                resp.setMsg("login failed! User name and password do not match");
                resp.setErrorCode(ErrorCodeConstants.INTERNAL_ERROR);
            }
        }catch(BusinessException e){
            resp.setSuccess(false);
            resp.setMsg(e.getMessage());
            resp.setErrorCode(e.getCode());
        }
        return resp;
    }
改造后:
    @RequestMapping(value="/login" ,method = RequestMethod.POST)
    public BaseResponse login(@RequestBody String body){
        BaseResponse resp = new BaseResponse();
        try{
            Gson gson = new Gson();
            Map obj = (Map)JSONObject.fromObject(body);
            if (!(obj.get("userName") instanceof String)){
                throw new BusinessException(ErrorCodeConstants.ARGUMENT_FAILURE,"login failed! The userName parameter must be of type String");
            } else if (!(obj.get("password") instanceof String)){
                throw new BusinessException(ErrorCodeConstants.ARGUMENT_FAILURE,"login failed! The password parameter must be of type String");
            } else if (!(obj.get("uuid") instanceof String)){
                throw new BusinessException(ErrorCodeConstants.ARGUMENT_FAILURE,"login failed! The uuid parameter must be of type String");
            }

            UserModel userModel = gson.fromJson(body, UserModel.class);

            resp.setSuccess(true);
            if(!userService.login(userModel)){
                resp.setSuccess(false);
                resp.setMsg("login failed! User name and password do not match");
                resp.setErrorCode(ErrorCodeConstants.INTERNAL_ERROR);
            }
        }catch(BusinessException e){
            resp.setSuccess(false);
            resp.setMsg(e.getMessage());
            resp.setErrorCode(e.getCode());
        }
        return resp;
    }
**代码讲解:**
这里的话本来是Spring MVC将前台传入的json字符串转换成实体类的对象,后来我直接在后台获取json字符串,并且通过JSONObject将其装换成Map<String,Object>,然后通过instanceof 来判断这个value的数据类型,然后通过Gson将其转换成实体类对象。
这样做的话也有一个弊端就是代码重复了,如果说在一两个方法里面有还好,如果很多方法需要进行判断的话就需要想别的方法。

**备注:**
    本人为职场小白、行业小白,这是本人写的第一篇博客,如果您觉得这种方法有点蠢请指教出来,让我学习学习,感谢
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值