Android在网络通信的过程中,经常会遇到数据传输的问题,而较为常见的数据传输的方式则是通过Json进行传输的。以下是请求服务器、返回Json以及对几种Json的解析的简单记录。
1、请求服务器,返回一个Json数组:
基本思路就是,先封装一个请求服务器的基类,类的传入参数是String类型,也就是网址,返回值也为String类型,为想得到的Json数组。采用HttpClient的方式。具体代码如下:
public class JsonUtil {
public static String stringJson;
public static final int REQUEST_TIMEOUT = 5 * 1000;
public static final int SO_TIMEOUT = 10 * 1000;
public static String Jsonreceive(String str) {
// 使用apache HTTP客户端实现
HttpPost request = new HttpPost(str);
try {
// 设置请求参数项
HttpClient client = getHttpClient();
// 执行请求返回相应
HttpResponse response = client.execute(request);
// 判断是否请求成功
if (response.getStatusLine().getStatusCode() == 200) {
// 获得响应信息
stringJson= EntityUtils.toString(response.getEntity());
}
} catch (Exception e) {
e.printStackTrace();
}
return stringJson;
}
// 初始化HttpClient,并设置超时
public static HttpClient getHttpClient() {
BasicHttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, REQUEST_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);
HttpClient client = new DefaultHttpClient(httpParams);
return client;
}
封装好之后,在需要获取Json的界面,调用这个方法就能实现获取Json的功能,具体代码如下:
public class JsonThread implements Runnable {
@Override
public void run() {
stringJson= JsonUtil.Jsonreceive(path);
Message msg = handler.obtainMessage();
msg.what = 0;
handler.sendMessage(msg);
}
}
由于该请求网络的操作是放在线程里面,而线程不允许对UI进行操作,所以,通过线程得到的值得通过handler发出来,然后在主线程中应用。这样就能得到服务器返回的Json,接下来就是对几种Json格式的解析。
1、{“num”:96,”name”:”小狗”,”code”:89};
解析代码:
JSONObject jsonObject = new JSONObject(stringJson);
int num = jsonObject.getInt("num");
int code= jsonObject.getInt("code");
String name = jsonObject.getString("name");
2、{“list”:[{“num”:95,”name”:”mike”},{“num”:96,”name”:”lucy”}]};
这种json格式的解析,先遍历出每个字段再放到数组里面:
JSONObject jsonObject = new JSONObject(stringJson);
jsonArray = jsonObject.getJSONArray("list");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject item = jsonArray.getJSONObject(i);
int num= item.getString("num");
String name= item.getString("name");
switch(i){
case 0:
String[] str = {""+num,name};
break
case 1:
String[] str1 = {""+num,name};
break
}
}
这样就可以得到list里面两个子数组,如果只想得到数组里面的字段,则直接遍历即可。
3、{
status: true,
info: “信息获取成功”,
results: {
typeid: “1”,
username: “1353456895”,
nickname: “bdjCM_231”,
name: null,
email: null,
sex: null,
img: “http://avatar/3034cd266545ef4e4c3ee4e664e0b4a5.jpg”
}
}
private void isnettest() {
boolean isnet = BaseActivity.isNetworkAvailable(UserActivity.this);
if (isnet == false) {
Toast.makeText(UserActivity.this, "请检查你的网络连接", Toast.LENGTH_SHORT).show();
} else {
Thread thread = new Thread(new UserThread());
thread.start();
}
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
new NormalLoadPictrue().getPicture(image, main_user_image_userimage);
if("null".equals(nickname)){
}else {
view2.setText(nickname);
}
break;
default:
break;
}
}
};
private class UserThread implements Runnable {
@Override
public void run() {
informationreturn = JsonUtil.loginServer(information);
Message msg = handler.obtainMessage();
try {
jsonObject = new JSONObject(informationreturn);
item = jsonObject.getJSONObject("results");
image = item.getString("img");
nickname = item.getString("nickname");
} catch (JSONException e) {
e.printStackTrace();
}
msg.what = 0;
handler.sendMessage(msg);
}
}
4、{“status”:true,”info”:”“,”results”:{“arr_come”:{“time”:”09:30–10:00”,”num”:3,”stay”:1},”arr_affter”:{“time”:”09:00–09:30”,”num”:8,”stay”:0},”arr_stay”:{“time”:”09:30–10:00”,”num”:3,”stay”:1}}}
customer_bestreturn = JsonUtil.loginServer(customer_best);
jsonObject2 = new JSONObject(customer_bestreturn);
item2 = jsonObject2.getJSONObject("results");
item2_1 = item2.getJSONObject("arr_come");
arr_come_num = item2_1.getInt("num");
arr_come_time = item2_1.getString("time");
item2_2 = item2.getJSONObject("arr_stay");
arr_stay_stay = item2_2.getInt("stay");
arr_stay_time = item2_2.getString("time");
item2_3 = item2.getJSONObject("arr_affter");
arr_affter_num = item2_3.getInt("num");
arr_affter_time = item2_3.getString("time");
5、results: [
{
id: “1”,
userid: “2”,
info: “今日的营业额有点差,”,
mark: “0”,
start: “1442630052”,
end: “1442892048”,
disabled: “0”,
time: “2015/09/22”,
edittime: “1442892048”,
flag: “1”
},
{
id: “20”,
userid: “2”,
info: “营业额有点差,”,
mark: “1”,
start: “1442630052”,
end: “1442892048”,
disabled: “0”,
time: “2015/09/22”,
edittime: “1442892048”,
flag: “0”
}
mymenoreturn = JsonUtil.loginServer(mymeno);
jsonObject3 = new JSONObject(mymenoreturn);
status = jsonObject3.getString("status");
jsonArray = jsonObject3.getJSONArray("results");
if ("true".equals(status)) {
for (int i = 0; i < jsonArray.length(); i++) {
item3 = jsonArray.getJSONObject(i);
info = item3.getString("info");
time = item3.getString("time");
mark = item3.getInt("mark");
menoid = item3.getInt("id");
if (mark == 1) {
starid = R.mipmap.main_home_image_star_on;
} else {
starid = R.mipmap.main_home_image_star_off;
}
HashMap map = new HashMap<>();
map.put("item_image_01", starid);
map.put("item_tv_01", info);
map.put("item_tv_02", time);
map.put("menoid",menoid);
listimageitem.add(map);
}
SimpleAdapter saImageItems = new SimpleAdapter(Home.this,
listimageitem,// 数据源
R.layout.activity_home_listview_item,// 显示布局
new String[]{"item_image_01", "item_tv_01", "item_tv_02"},
new int[]{R.id.main_home_image_listview_itemImage, R.id.main_home_tv_listview_item_01,
R.id.main_home_tv_listview_item_02});
listview.setAdapter(saImageItems);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
HashMap map = (HashMap) listview.getItemAtPosition(position);
int kk = (int) map.get("menoid");
Intent intent = new Intent();
intent.putExtra("menoid", kk+"");
intent.setClass(Home.this, Mymeno.class);
startActivity(intent);
}
});
}
注:数组在日志中的输出,不能直接输出数组名称,而是应该用:
System.out.println(“uyk” + Arrays.asList(str));
“`