• json使用小结


    json 使用小结

    此篇仅仅为我遇到的问题。

    环境SpringBoot 2.1.7

    首先需要知道的是Springboot 默认使用的是Jackson,即使没有配置,@ResponseBody 即可。但是后期我发现,可以先导入 fastJson ,如果转换有问题的话,直接调用fastJson 即可看到问题。注意的是,会把null删除。

    在此我罗列了几点使用

    1. 前端传输问题

    2. 后端接收数据问题

    3. 回传问题

    4. 如何判断自己哪里错了

      1. dubug查看自己能否在后端接受
      2. 500,可以先用fastJson进行转换,看看转换的数据问题,我就遇到了全为空,
      3. 查看前端回传的XHR

      (以下代码很不全,只需要看核心即可。)

      其实很多500问题,都需要调dubug去做,前端的代码问题很少,一般都是后端的问题

      先写几个注意点

      1. 前端发送设置

         contentType: "application/json; charset=UTF-8",
        

        这个utf-8 有争议,会出现WARN。这样的get post都能穿,我在这里效果确实实现了,但是继续改进好像吧utf-8去掉就可以了。

      2. 后端使用@Resquest 接受对象或者参数

        public ResultModel  checkLogin(HttpServletRequest request, @RequestBody  User user)
        
      3. 利用map进行存储时,不能

        Map<String,Object> hashMap=new HashMap<>();
        

        Object ,这里就要说一个问题。Object是访问不到对象的get等自定义的方法的。

        必须为对象

        Map<String,User> hashMap=new HashMap<>();
        

        其实这边直接返回也可以了,但是我容易忽略一点,一开始就是回传成功的。是因为我在User上使用了@Data,但是下面DTO没有加。toJsonString 是依赖这些get 方法去获得属性值的。

      4. 使用DTO进行封装

        使用DTO时候,用到了另一个Enum,下面再贴代码好了。

        DTO,保证回传。

      5. 后端返回 如果是String ,其实就是在外面嵌套了一个 “” ,所以有些地方是统一String返回(先用fastJson.toJsonSting(ResultDTO)这是我看到有人是这么写的。。。。似乎也没错),

        还有就是我将@Controller 和@ResponseBody 分开写了,如果愿意的话,@RestController 即可。

      6. 前端接收

        ​ success(res)的问题而已,网上很多。

      前端问题和后端接收

      前端的话我用的是Jquery去实现。

      题外对比 那么第一种是 serialize()

    <script>
        $('form').submit(function () {
            layer.msg('wocao',{time:2000});
            var username=$("input[name='username']").val();
            if(username==null){
                layer.msg('用户名不能为空!',{time:2000});
                return false;
            }
            var password=$("input[name='password']").val();
            var url=$(this).attr('action');
            var formData=$("#form").serialize();
            $.ajax({
                type: "post",
                url: url,
                dataType: "json",
                data: formData,
                success: function(hashmap){
                    if (hashmap.status == 1) {
                        layer.msg(hashmap.message, {time: 1000}, function () {
                            // window.location.href = "/admin/user_list/lists";
                            // layer.msg(.message);
                            window.location.href="/demo/success";
    
                        });
                    } else {
                        //刷新验证码
                        // $(".reloadverify").click();
                        layer.msg(hashmap.message);
                    }
                }
            });
            return  false;
        });
    </script>
    

    那么接收其实用不到@ResquestBody

     public String checkLogin(HttpServletRequest request,String username,String password){}
    

    直接对应属性接受即可。

    json格式发送与接收

     <script>
            $('form').submit(function () {
                layer.msg('wocao',{time:2000});
                var username=$("input[name='username']").val();
                if(username==null){
                    layer.msg('用户名不能为空!',{time:2000});
                    return false;
                }
                var password=$("input[name='password']").val();
                var url=$(this).attr('action');
                var formData=$("#form").serialize();
                $.ajax({
                    type: "post",
                    url: url,
                    contentType: "application/json; charset=UTF-8",
                    dataType: "json",
                    data: JSON.stringify({
                        userName: username,
                        password: password
                    }),
                    success: function(res){
                        if (res.code == "002") {
                            layer.msg(res.msg, {time: 1000}, function () {
                                // window.location.href = "/admin/user_list/lists";
                                // layer.msg(.message);
                                window.location.href="/demo/success";
    
                            });
                        } else {
                            //刷新验证码
                            // $(".reloadverify").click();
                            layer.msg(res.msg);
                        }
                    },error:function(xhr){alert(xhr.responseText)}
                });
                return  false;
            });
        </script>
    

    后端接收利用@ResquestBody

        @ResponseBody//直接返回json 值
        @PostMapping("/checkLogin")
        public ResultModel  checkLogin(HttpServletRequest request, @RequestBody  User user){
            String password= user.getPassword();
            Map<String,User> hashMap=new HashMap<>();
            boolean result=password.equals(userService.getUser(Integer.parseInt(user.getUserName())).getPassword());
            if (result) {
                request.getSession().setAttribute("admin_id",user.getUserName());
    //            hashMap.put("status",1);
    //            hashMap.put("message","登陆成功");
                hashMap.put("user",user);
    //            return JSON.toJSONString(hashMap);
                return (new ResultModel<Map<String ,User>>().setSuccess(hashMap));
    //            String res=JSON.toJSONString(hashMap);
    //            return res;
            }
            else {
    
                System.out.println(123);
    //            return JSON.toJSONString(new ResultModel<Map<String ,Object >>().setError(null));
                return new ResultModel<Map<String ,Object >>().setError(null);
    
            }
        }
    
    

    Springboot No converter found for return value of type: class

    这个提示我是从前端回传看到的。。。但是我看不少人从后端看到的

    Spring 都自带了jackson,所以一般是get方法没写,建议直接用@Data算了

  • 相关阅读:
    MYSQL数据类型——字符串类型
    MYSQL——记录长度
    MYSQL数据类型——时间日期类型
    MYSQL数据类型——数值类型
    为什么在 IDEA jsp 中直接使用 out.println 会出错
    花指令行为大赏
    EasyCpp 题解
    [SUCTF2019] hardcpp 题解
    洛谷 P1650 田忌赛马题解
    Dict 协议是什么
  • 原文地址:https://www.cnblogs.com/EsMussSeinHui/p/11438815.html
Copyright © 2020-2023  润新知