在设备通讯中,往往会用到数据交互。我们这里用的是通过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值直接取valueString 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
jsonObject = jsonArray.getJSONObject(i);
Map map = new HashMap();
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目录下