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


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

//如下的拼装结果为:

{"data":[{"id":"12345","name":"张三"},{"id":"54321","name":"李四"}]}
JSONObjectjsonObject=newJSONObject();JSONArrayjsonArray=newJSONArray();try{jsonObject.put("name","张三");jsonObject.put("id","12345");jsonArray.put(jsonObject);jsonObject=newJSONObject();jsonObject.put("name","李四");jsonObject.put("id","54321");jsonArray.put(jsonObject);Stringjson="{\"data\":"+jsonArray.toString()+"}";Log.v("zd","json");result=newHttpUtils().sendJsonData(Consant.ip+Consant.url3,json);mHandler.sendEmptyMessage(0x0001);}catch(JSONExceptione){e.printStackTrace();}


/**

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

* svrUrl为服务器地址

* ParamStr为JSON字符串

* 发送类型为 POST

*/

publicStringsendJsonData(StringsvrUrl,StringParamStr){Log.v("zd","sendjson");try{//转成指定格式byte[]requestData=ParamStr.getBytes("UTF-8");HttpURLConnectionconn=null;DataOutputStreamoutStream=null;StringMULTIPART_FORM_DATA="multipart/form-data";//构造一个post请求的http头URLurl=newURL(svrUrl);//服务器地址conn=(HttpURLConnection)url.openConnection();conn.setDoInput(true);//允许输入conn.setDoOutput(true);//允许输出conn.setUseCaches(false);//不使用cachesconn.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=newDataOutputStream(conn.getOutputStream());outStream.write(requestData,0,requestData.length);outStream.flush();outStream.close();ByteArrayOutputStreamoutStream2=newByteArrayOutputStream();intcah=conn.getResponseCode();if(cah!=200){Log.v("data","服务器响应错误代码:"+cah);return"0";}elseif(cah==200){Log.v("data","服务器响应成功:"+cah);}InputStreaminputStream=conn.getInputStream();intlen=0;byte[]data=newbyte[1024];while((len=inputStream.read(data))!=-1){outStream2.write(data,0,len);}outStream2.close();inputStream.close();StringresponseStr=newString(outStream2.toByteArray());Log.v("data","data="+responseStr);returnresponseStr;}catch(Exceptione){return"";}}


接下来看一看后台的处理

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

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

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{request.setCharacterEncoding("utf-8");Stringmethod=request.getParameter("method").toString();System.out.println("method="+method);System.out.println(newDate().toLocaleString());StringjsonData=getData(request);try{jsonStringToList(jsonData);}catch(Exceptione){e.printStackTrace();}doGet(request,response);}
publicStringgetData(HttpServletRequestreq){Stringresult=null;try{//包装request的输入流BufferedReaderbr=newBufferedReader(newInputStreamReader((ServletInputStream)req.getInputStream(),"utf-8"));//缓冲字符StringBuffersb=newStringBuffer("");Stringline;while((line=br.readLine())!=null){sb.append(line);}br.close();//关闭缓冲流result=sb.toString();//转换成字符System.out.println("result="+result);}catch(Exceptione){e.printStackTrace();}returnresult;}

通过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

Stringmsg=jsonObject.getString("data").toString();

取出来的结果即为:

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

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

for(Iterator<?>iter=jsonObject.keys();iter.hasNext();){Stringkey=(String)iter.next();Stringvalue=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(inti=0;i<jsonArray.size();i++){jsonObject=jsonArray.getJSONObject(i);Map<String,String>map=newHashMap<String,String>();for(Iterator<?>iter=jsonObject.keys();iter.hasNext();){Stringkey=(String)iter.next();Stringvalue=jsonObject.get(key).toString();System.out.println(key+"/"+value);map.put(key,value);}//这里是知道key值,直接取数据//Stringname=jsonObject.getString("name").toString();//Stringid=jsonObject.getString("id").toString();////System.out.println(name+"/"+id);}
id/12345name/张三id/54321name/李四


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

JSONArray jsonArray = JSONArray.fromObject(jsonStr);

只需转换为JsonArray即可。


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

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

更多相关文章

  1. tcping测试服务器TCP端口
  2. Android官方开发语音--Kotlin
  3. (一)、Kotlin学习
  4. (二)Android系统基础-1 APP类型简介
  5. Android中简单轻量级的数据缓存类库DCache
  6. Android(安卓)资源详解(一) 颜色、字符串、位图资源
  7. Android中string.xml,动态改变数据方法
  8. 【android】AIDL传递自定义类型参数
  9. Android下DLAN中DMS模块的实现

随机推荐

  1. MySQL隐式类型转换导致索引失效的解决
  2. 浅谈MySQL数据查询太多会OOM吗
  3. MySQL多表连接查询详解
  4. sqlmap注入图文详解
  5. mysql之group by和having用法详解
  6. MySQL DEFINER具体使用详解
  7. 一篇文章带你了解SQL之CASE WHEN用法详解
  8. MySQL隔离级别和锁机制的深入讲解
  9. 浅析MySQL 主键使用数字还是uuid查询快
  10. MySQL之权限以及设计数据库案例讲解