json使用小结

Posted esmussseinhui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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算了

以上是关于json使用小结的主要内容,如果未能解决你的问题,请参考以下文章

JSON的使用小结

js小结

AJAX与JSON与Controller使用小结

python爬微信公众号前10篇历史文章-JSON相关内容小结

Json小结

<php>json小结