android java json_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值直接取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目录下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值