关于java接收前台$.ajax格式为多维json数组数据为null的原因及解决方法

来源:互联网 发布:方舟生存进化优化设置 编辑:程序博客网 时间:2024/03/29 14:01

前言

最近在使用java接收前台$.ajax数据格式为多维json数组数据时,遇到了一个问题,问题例子如下:

<!doctype html><html lang="en"><head>    <meta charset="UTF-8">    <title>Document</title>    <script src="jquery-1.7.2.js"></script>    <script>        //前台代码如下        $(document).ready(function(){            $('#btn').click(function(){                //obj为多维json数组数据格式                var obj={                    name:'key',                    age:18,                    sex:'男',                    info:{                        qq:'123456',                        email:'123456@qq.com',                        girlFriend:{                            name:'lucy',                            age:18,                            sex:'女'                        }                    }                };                $.ajax({                    type:'post',                    url:'Test',                    data:obj,                    dataType:'json',                    success:function(data){                        console.log(data);                    }                });            });        });    </script></head><body>    <button id="btn">按钮</button></body></html>

后台java代码如下:

    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        request.setCharacterEncoding("utf-8");        PrintWriter out = response.getWriter();        System.out.println(request.getParameter("name"));//key        System.out.println(request.getParameter("age"));//18        //一维数据如:name、age、sex等都可以通过request.getParameter获取到,当获取二维数据"info"时却打印为null        System.out.println(request.getParameter("info"));//null        out.flush();        out.close();    }

原因

因为前台ajax的XMLHttpRequest对象send()方法(post方式)发送数据的数据格式应为send(“name=key&age=18&sex=男”),却不能是这样的send(“…sex=男&info={…}”)即(不能为info={…})。但是php却能成功的接收到,而java却为null,这里暂时将原因归咎于java对数据的解析问题,如果有读者知道根本原因还请评论留言给我,感激不尽。

解决方法

前台代码如下:

<!doctype html><html lang="en"><head>    <meta charset="UTF-8">    <title>Document</title>    <script src="jquery-1.7.2.js"></script>    <script>        $(document).ready(function(){            $('#btn').click(function(){                //将多维数据的值设为json格式的字符串                /*var obj={                    name:'key',                    age:18,                    sex:'男',                    info:"{qq:'123456',email:'123456@qq.com',girlFriend:{name:'lucy',age:18,sex:'女'}}"                }*/                //或者为这样(可以调用JSON.stringify(jsonObj)转换为字符串),整个用request.getParameter("data")接收                var obj={data:"{name:'key',age:18,sex:'男',info:{qq:'123456',email:'123456@qq.com',girlFriend:{name:'lucy',age:18,sex:'女'}}}"}                $.ajax({                    type:'post',                    url:'Test',                    data:obj,                    dataType:'json',                    success:function(data){                        console.log(data);                    }                });            });        });    </script></head><body>    <button id="btn">按钮</button></body></html>

后台代码如下:

public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        request.setCharacterEncoding("utf-8");        response.setContentType("text/plain;charset=utf-8");        PrintWriter out = response.getWriter();        System.out.println(request.getParameter("data"));        JSONObject strJson = parseStr(request.getParameter("data"));        try {            System.out.println(strJson.getString("name"));//key            System.out.println(strJson.getString("age"));//18            System.out.println(strJson.getString("info"));            //{"email":"123456@qq.com","girlFriend":{"sex":"女","age":18,"name":"lucy"},"qq":"123456"}            out.write(strJson.getString("info"));        } catch (JSONException e) {            e.printStackTrace();        }        out.flush();        out.close();    }    public JSONObject parseStr(String str) {        try {            return new JSONObject(str);        } catch (JSONException e) {            e.printStackTrace();        }        return null;    }

其中用到的是:
java的json数据解析jar包[点击下载]
jar包导入方法可根据自己的编辑器自行百度

0 0