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算了

原文地址:https://www.cnblogs.com/EsMussSeinHui/p/11438815.html