您的位置:首页 > 移动开发 > Android开发

Android入门:通过JSON数据与服务器进行通信

2012-07-06 22:25 447 查看
我们完成“Android入门:通过XML数据与服务器进行通信“同样的功能,只是数据传输使用JSON而不是XML;

注意点:

(1)当返回JSON时,content-type为text/json;

(2)通过JSON包进行解析JSON格式数据和生成JSON格式数据;

(3)Android中已经集成了JSON的包;

一、核心代码介绍

服务器端核心代码:

(1)JSONStringer stringer = new JSONStringer();

(2)stringer.array().endArray();

(3)stringer.object().key("key").value("value").endObject();

(4)String str = stringer.toString();

客户端核心代码:

(1)JSONArray array = new JSONArray(String str);
//将字符串转为JSONArray格式

(2)JSONObject object = array.getJSONObject(int index);

(3)int value = object.getInt(String name);

(4)String value = object.getString(String name);

二、全部代码

服务器端:

ListServlet.java

package org.xiazdong.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONStringer;
import org.xiazdong.domain.Person;

@WebServlet("/ListServlet")
public class ListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Person> list = new ArrayList<Person>();
for(int i=0;i<4;i++){
Person person = new Person(i,"xiazdong-"+i,20+i);
list.add(person);
}
//将List<Person>组织成JSON字符串
JSONStringer stringer = new JSONStringer();
try{
stringer.array();
for(Person person:list){
stringer.object().key("id").value(person.getId()).key("name").value(person.getName()).key("age").value(person.getAge()).endObject();
}
stringer.endArray();
}
catch(Exception e){}
response.getOutputStream().write(stringer.toString().getBytes("UTF-8"));
response.setContentType("text/json; charset=UTF-8");  //JSON的类型为text/json
}

}


在浏览器中访问效果如下:



客户端:

MainActivity.java

package org.xiazdong.personlist;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONObject;
import org.xiazdong.domain.Person;
import org.xmlpull.v1.XmlPullParser;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {
private ListView listView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView) this.findViewById(R.id.listview);
List<Person> persons = null;
try {
persons = getJSONData();
} catch (Exception e) {
e.printStackTrace();
}
List<Map<String, Object>> maps = new ArrayList<Map<String, Object>>();
for (Person person : persons) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", person.getId());
map.put("name", person.getName());
map.put("age", person.getAge());
maps.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(this, maps, R.layout.item,
new String[] { "id", "name", "age" }, new int[] { R.id.id,
R.id.name, R.id.age });
listView.setAdapter(adapter);
}

//读取JSON数据并转为List<Person>
private List<Person> getJSONData() throws Exception {
List<Person> persons = new ArrayList<Person>();
URL url = new URL("http://192.168.0.103:8080/Server/ListServlet");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
if (conn.getResponseCode() == 200) {
InputStream in = conn.getInputStream();
persons = parseJSON(in);
}
return persons;

}
private List<Person> parseJSON(InputStream in)throws Exception{
List<Person> persons = new ArrayList<Person>();
Person person = null;
String str = read(in);
JSONArray array = new JSONArray(str);
int length = array.length();
for(int i=0;i<length;i++){
JSONObject object = array.getJSONObject(i);
person = new Person(object.getInt("id"), object.getString("name"), object.getInt("age"));
persons.add(person);
}
return persons;
}
private String read(InputStream in) throws IOException {
byte[] data;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[]buf = new byte[1024];
int len = 0;
while((len = in.read(buf))!=-1){
bout.write(buf, 0, len);
}
data = bout.toByteArray();
return new String(data,"UTF-8");
}
}


总结:

JSON和XML都是数据传输的两种格式;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: