Java后台解析android端发送的JSON字符串
在设备通讯中,往往会用到数据交互。我们这里用的是通过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目录下
更多相关文章
- tcping测试服务器TCP端口
- Android官方开发语音--Kotlin
- (一)、Kotlin学习
- (二)Android系统基础-1 APP类型简介
- Android中简单轻量级的数据缓存类库DCache
- Android(安卓)资源详解(一) 颜色、字符串、位图资源
- Android中string.xml,动态改变数据方法
- 【android】AIDL传递自定义类型参数
- Android下DLAN中DMS模块的实现