下面分别使用GET和POST方式从网络后台拉取如下的JSON格式的数据,并在客户端进行解析:
{
"code": "200",
"message": "Get Success",
"result": [
{
"name": "Tom",
"age": 19,
"sex": "男"
},
{
"name": "Kate",
"age": 18,
"sex": "女"
},
{
"name": "Jim",
"age": 23,
"sex": "男"
}
]
}
[说明]JSON格式的数据中,大括号{ }包裹的则为JsonObject,而中括号[ ]包裹的则为JsonArray。
零.为了解析方便,首先创建一个Student的类,如下:
public class Student
{
private String name;
private int age;
private String sex;
public Student()
{
}
// Getter和Setter方法
}
一.GET方式获取并解析JSON数据
public HashMap<String, Object> getStudentsInfos(String account, String password) throws Exception
{
String webUrl = "http://mxd/study.php?account=" + account + "&password=" + password;
HttpGet httpGet = new HttpGet(webUrl);
HttpClient httpClient = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 10 * 1000);// 设置请求超时
HttpConnectionParams.setSoTimeout(httpClient.getParams(), 10 * 1000);// 设置响应超时
HttpResponse response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200)
{ // =200表示拉取数据正常
return parseStudentsInfos(response);
} else
{
HashMap<String, Object> tempMap = new HashMap<String, Object>();
tempMap.put("code", "0");
tempMap.put("message", "网络请求超时,请检查您的网络链接!");
return tempMap;
}
}
private HashMap<String, Object> parseStudentsInfos(HttpResponse response) throws Exception
{
HttpEntity httpEntity = response.getEntity();
InputStream inputStream = httpEntity.getContent();
String resultStr = StreamTool.read(inputStream); // 将输入流转化为_字符串
HashMap<String, Object> infoMap = new HashMap<String, Object>();
JSONObject jsonObject = new JSONObject(resultStr);
String code = jsonObject.getString("code");
infoMap.put("code", code);
String message = jsonObject.getString("message");
infoMap.put("message", message);
if (code.equals("200"))
{
List<Student> studentList = new ArrayList<Student>();
Student student = null;
JSONObject stuJson = null;
if (jsonObject.getJSONArray("result") != null)
{
JSONArray result = jsonObject.getJSONArray("result");
int videoCount = result.length(); // 此处,避免在for的第二个参数处出现result.length()操作
for (int i = 0; i < videoCount; i++)
{
stuJson = result.getJSONObject(i);
student = new Student(); // 实例化
student.setName_Studnet(stuJson.getString("name"));
student.setAge_Studnet(stuJson.getInt("age"));
student.setSex_Studnet(stuJson.getString("sex"));
studentList.add(student);
student = null;
stuJson = null;
}
}
infoMap.put("studentList", studentList);
}
return infoMap;
}
二.POST方式获取并解析JSON数据
public HashMap<String, Object> getStudentsInfos(String account, String password) throws Exception
{
String urlpath = "http://mxd/study.php";
NameValuePair pair1 = new BasicNameValuePair("account", account); // 传入参数
NameValuePair pair2 = new BasicNameValuePair("password", password);// 传入参数
List<NameValuePair> pairList = new ArrayList<NameValuePair>();
pairList.add(pair1);
pairList.add(pair2);
HttpEntity requestHttpEntity = new UrlEncodedFormEntity(pairList, HTTP.UTF_8); // 解决中文乱码的问题
HttpPost httpPost = new HttpPost(urlpath);// URL使用基本URL即可,其中不需要加参数
httpPost.addHeader("charset", HTTP.UTF_8); // 设置编码格式
httpPost.setEntity(requestHttpEntity);// 将请求体内容加入请求中
HttpClient httpClient = new DefaultHttpClient();// 需要客户端对象来发送请求
HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 10 * 1000);// 设置请求超时
HttpConnectionParams.setSoTimeout(httpClient.getParams(), 10 * 1000);// 设置响应超时
HttpResponse response = httpClient.execute(httpPost);// 发送请求
if (response.getStatusLine().getStatusCode() == 200)
{
return parseStudentsInfos(response);
} else
{
HashMap<String, Object> tempMap = new HashMap<String, Object>();
tempMap.put("code", "0");
tempMap.put("message", "网络请求超时,请检查您的网络链接!");
return tempMap;
}
}
private HashMap<String, Object> parseStudentsInfos(HttpResponse response) throws Exception
{
HttpEntity httpEntity = response.getEntity();
InputStream inputStream = httpEntity.getContent();
String resultStr = StreamTool.read(inputStream); // 将输入流转化为_字符串
HashMap<String, Object> infoMap = new HashMap<String, Object>();
JSONObject jsonObject = new JSONObject(resultStr);
String code = jsonObject.getString("code");
infoMap.put("code", code);
String message = jsonObject.getString("message");
infoMap.put("message", message);
if (code.equals("200"))
{
List<Student> studentList = new ArrayList<Student>();
Student student = null;
JSONObject stuJson = null;
if (jsonObject.getJSONArray("result") != null)
{
JSONArray result = jsonObject.getJSONArray("result");
int videoCount = result.length(); // 此处,避免在for的第二个参数处出现result.length()操作
for (int i = 0; i < videoCount; i++)
{
stuJson = result.getJSONObject(i);
student = new Student(); // 实例化
student.setName_Studnet(stuJson.getString("name"));
student.setAge_Studnet(stuJson.getInt("age"));
student.setSex_Studnet(stuJson.getString("sex"));
studentList.add(student);
student = null;
stuJson = null;
}
}
infoMap.put("studentList", studentList);
}
return infoMap;
}
GET和POST方式中都用到了一个StreamTool这个工具类,负责将InputStream转化为String,StreamTool.java工具类如下:
package com.***.utils;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* @This class is used to parse info from InputStream!
*/
public class StreamTool
{
/**
* @param is
* 输入流
* @return 返回将输入流转化为 字符串之后
* @throws Exception
*/
public static String read(InputStream is) throws Exception
{
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String result = "";
String line = "";
while (null != (line = reader.readLine()))
{
result += line;
}
is.close(); // 关闭输入流
return result;
}
}