Java后台解析android端发送的JSON字符串


    在设备通讯中,往往会用到数据交互。我们这里用的是通过HTTP协议发送JSON数据,android客户端把数据进行打包,发送到后台服务器,后台解析出来。

    

 //android客户端拼装JSON字符串

//如下的拼装结果为:

{"data":[{"id":"12345","name":"张三"},{"id":"54321","name":"李四"}]}
JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = new JSONArray();
    try {
        jsonObject.put("name", "张三");
        jsonObject.put("id", "12345");
        jsonArray.put(jsonObject);
        
        jsonObject = new JSONObject();
        jsonObject.put("name", "李四");
        jsonObject.put("id", "54321");
        jsonArray.put(jsonObject);
        
        String json = "{\"data\":"+jsonArray.toString()+"}";
        Log.v("zd", "json");
        result = new HttpUtils().sendJsonData(Consant.ip + Consant.url3, json);
        mHandler.sendEmptyMessage(0x0001);
    } catch (JSONException e) {
        e.printStackTrace();
    }


/**

* 向服务器发送数据,编码类型为utf-8

* svrUrl为服务器地址

* ParamStr为JSON字符串

         * 发送类型为 POST

*/

public String sendJsonData(String svrUrl, String ParamStr) {
    Log.v("zd", "send json");
    try {
    // 转成指定格式
        byte[] requestData = ParamStr.getBytes("UTF-8");
        HttpURLConnection conn = null;
        DataOutputStream outStream = null;
        String MULTIPART_FORM_DATA = "multipart/form-data";
        
        // 构造一个post请求的http头
        URL url = new URL(svrUrl); // 服务器地址
        conn = (HttpURLConnection) url.openConnection();
        conn.setDoInput(true); // 允许输入
        conn.setDoOutput(true); // 允许输出
        conn.setUseCaches(false); // 不使用caches
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3");
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA);
        conn.setRequestProperty("Content-Length", Long.toString(requestData.length));
        conn.setRequestProperty("data", ParamStr);
        // 请求参数内容, 获取输出到网络的连接流对象
        outStream = new DataOutputStream(conn.getOutputStream());
        outStream.write(requestData, 0, requestData.length);
        outStream.flush();
        outStream.close();
        ByteArrayOutputStream outStream2 = new ByteArrayOutputStream();
        
        int cah = conn.getResponseCode();
        if (cah != 200) {
            Log.v("data", "服务器响应错误代码:" + cah);
            return "0";
        }else if(cah == 200){
            Log.v("data", "服务器响应成功:" + cah);
        }
        InputStream inputStream = conn.getInputStream();
        int len = 0;
        byte[] data = new byte[1024];
        
        while ((len = inputStream.read(data)) != -1) {
                outStream2.write(data, 0, len);
        }
        outStream2.close();
        inputStream.close();
        String responseStr = new String(outStream2.toByteArray());
        Log.v("data", "data = " + responseStr);
        
        return responseStr;
    } catch (Exception e) {
        return "";
    }
}


接下来看一看后台的处理

后台用的是Java利用Tomcat作为服务器

创建的是一个动态的Web项目,通过Servlet的doPost()方法来接收

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String method = request.getParameter("method").toString();
        System.out.println("method = " + method);
        System.out.println(new Date().toLocaleString());
        String jsonData = getData(request);
    try {
        jsonStringToList(jsonData);
    } catch (Exception e) {
        e.printStackTrace();
    }
    doGet(request, response);
}
public String getData(HttpServletRequest req){
        String result = null;
        try {
            //包装request的输入流
            BufferedReader br = new BufferedReader(  
              new InputStreamReader((ServletInputStream) req.getInputStream(), "utf-8"));
            //缓冲字符
            StringBuffer sb=new StringBuffer("");
            String line;
            while((line=br.readLine())!=null){
                sb.append(line);
            }
            br.close();//关闭缓冲流
            result=sb.toString();//转换成字符
            System.out.println("result = " + result);
        } catch (Exception e) {
            e.printStackTrace();
        }  
            return result;
}

 通过getData()方法获取发送的字符流即JSON字符串

 接下来对json字符串进行解析

 首先我们来分析一下这个json字符串的特点

 {"data":[{"id":"12345","name":"张三"},{"id":"54321","name":"李四"}]}

 可以发现它符合这样一个类型{key : value}即JSonObject类型

 通过这样的方法把它转为JSONObject 

 JSONObject jsonObject = JSONObject.fromObject(jsonStr);

 在这里会出现两种情况,知道key值和不知道key值。

 第一种知道Key我们可以根据key值直接取value

     String msg = jsonObject.getString("data").toString();

 取出来的结果即为:

 [{"id":"12345","name":"张三"},{"id":"54321","name":"李四"}]

第二种在不知道key值的情况取值,用到了迭代器

    for (Iterator<?> iter = jsonObject.keys(); iter.hasNext();) {
        String key = (String) iter.next();
        String value = jsonObject.get(key).toString();
        System.out.println(key + "/" + value);
        map.put(key, value);
    }

 这里的key和value

 分别对应data、[{"id":"12345","name":"张三"},{"id":"54321","name":"李四"}]


 接下来我们再分析一下取出来的value值

 不难发现它是一个JSonArray类型

 我们用for循环来遍历这个jsonarray

 在这里同样有两种情况,知道key值和不知道key值

 知道key值直接根据key取即可,不知道则利用迭代器,至于迭代器不做详细介绍

for (int i = 0; i < jsonArray.size(); i++) {
    jsonObject = jsonArray.getJSONObject(i);
    
        Map<String, String> map = new HashMap<String, String>();
    
        for (Iterator<?> iter = jsonObject.keys(); iter.hasNext();) {
            String key = (String) iter.next();
            String value = jsonObject.get(key).toString();
            System.out.println(key + "/" + value);
            map.put(key, value);
        }
        
        //这里是知道key值,直接取数据
        //String name = jsonObject.getString("name").toString();
        //String id = jsonObject.getString("id").toString();
        //
        //System.out.println(name + "/" + id);
}
id/12345
name/张三
id/54321
name/李四


 PS:我们这里传过来的JSON数据类型为JSonObject,有时也会传过来JSonArray类型

 JSONArray jsonArray = JSONArray.fromObject(jsonStr);

 只需转换为JsonArray即可。


 另外Java后台别忘了导入json解析包,可在本页面下载。

 不是纯导入哦,需要放在lib目录下

你可能感兴趣的:(Java后台解析json数据)