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即可。

时间: 2024-10-31 06:15:51

Java后台解析android端发送的JSON字符串的相关文章

Java后台 解析JSON的几个方法

1.对象转JSON对象. public static void main(String[] args) { Domain demo = new Domain( "在线JSON校验格式化工具 -SOJSON在线工具(sojson.com)", "http://www.sojson.com/", "提供json在线格式化,json在线格式化工具,json 格式化输出,json格式化 空串,json 格式化插件,json字符串格式化,json视图,json 在线

Jsoup解析Html标签(Java后台解析)

中文API网站(下载地址): http://www.open-open.com/jsoup/ 有时候编辑器传到后台的内容是带Html标签的,或者有时候需要形成一个完整的Html文档,也或者需要解析其中的文字(text()),Java后台处理用Jsoup非常方便,也可以用选择器快速获取元素,类似于jQuery.获取到文档对此之后对其处理与JS处理DOM一样方便,选取元素也类似于JS,也有类似于jQuery的语法,官方的解释 1.最基本的解析Html字符串 @Test public void tes

使用Jackson解析首字母大写的json字符串

Jackson在解析返回的json字符串时始终报错,纠结很久之后才找到原因,原来是是由于json字符串中的字母都是首字母大写,导致jackson找不到相应的KEY. 在项目中经常使用从服务器获取的数据,有时从服务器获取的json字符串中的首字母是大写的,使用Jackson解析是就会报一下错误: Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecogniz

android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据

补充:关于PHP服务端可能出现的问题: 如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!! 在android应用中访问的IP都是10.0.2.2,如果在apache虚拟主机配置文件中配置了多个虚拟主机,那么将默认解析为对第一个虚拟主机的请求,所以,在调试android应用时,应该将对应的服务端所配置的那个虚拟主机放在配置文件中的第一个虚拟主机的位置.否则就会出现请求的文件不存在等的错误. 服务端返回JSON数据及

unity3d在Android端读取修改Json数据

首先我们需要下载一个文件 LitJson.dll(下载链接 ps: 是用自己的百度云盘下载的如果链接过时,请留言或自行下载, 密码: 5foa) 另外,由于我们要发布到安卓手机上,所以需要配置Jar和SDK,由于这里主要讲Json在安卓端的修改和读取,在这里就不细说了,当然如果不发布手机端的话,电脑端也是可以正常使用的 (1)首先我们来简单搭建一个测试环境(如图) 从上到下依次为text文本框, 按钮, 输入框, 按钮, 功能如图显示(如果需要的话可以把UI放大,以免在手机上面太小,或者在Gam

java 后台解析excel上传数据 工具类

后台调用: MultipartFile file: List<String[]> excelDate package com.holike.crm.partner.sys; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.apache.poi.h

android实现json数据的解析和把数据转换成json格式的字符串

利用android sdk里面的 JSONObject和JSONArray把集合或者普通数据,转换成json格式的字符串 JSONObject和JSONArray解析json格式的字符串为集合或者一般数据 package com.hck.test; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.

Java学习总结(随笔)——利用JSON解析实现网络下载

利用JSON实现网络下载1.下载json字符串:(1)将网址封装到URL中:URL url=new URL("网址");(2)利用url打开HTTP: HttpURLConnection conn= (HttpURLConnection)ulr.openConnection();(3)开始连接:conn.connect();(4)利用输入流读取网络数据:(5)将下载的数据转换成字节数组:2.下载所需资源:与上述步骤相同,最后利用输出流,写入到目标地址例1(我们以下载图片为例(注释中详细

移动端接口碰到了服务器无法解析ios端传回?

今天在为移动端写接口的时候碰到了服务器无法解析ios端传回的json数据的问题(在服务器上能收到请求,但无法得到请求体里的json数据)希望有大牛可以解答一下?后端代码为 //@RequestBody LoginModule json @RequestMapping(value = "/test" ,method = RequestMethod.POST ) @ResponseBody public SeckillResult<Long> test(HttpServletR