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


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

注意点:

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

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

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

相关阅读:Android入门:通过XML数据与服务器进行通信 


一、核心代码介绍


服务器端核心代码:


(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

  1. package org.xiazdong.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.annotation.WebServlet;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12.   
  13. import org.json.JSONStringer;  
  14. import org.xiazdong.domain.Person;  
  15.   
  16.   
  17. @WebServlet("/ListServlet")  
  18. public class ListServlet extends HttpServlet {  
  19.     private static final long serialVersionUID = 1L;  
  20.   
  21.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  22.         doPost(request,response);  
  23.     }  
  24.   
  25.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  26.         List<Person> list = new ArrayList<Person>();  
  27.         for(int i=0;i<4;i++){  
  28.             Person person = new Person(i,"xiazdong-"+i,20+i);  
  29.             list.add(person);  
  30.         }  
  31.         //将List<Person>组织成JSON字符串   
  32.         JSONStringer stringer = new JSONStringer();  
  33.         try{  
  34.             stringer.array();  
  35.             for(Person person:list){  
  36.                 stringer.object().key("id").value(person.getId()).key("name").value(person.getName()).key("age").value(person.getAge()).endObject();  
  37.             }  
  38.             stringer.endArray();  
  39.         }  
  40.         catch(Exception e){}  
  41.         response.getOutputStream().write(stringer.toString().getBytes("UTF-8"));  
  42.         response.setContentType("text/json; charset=UTF-8");  //JSON的类型为text/json   
  43.     }  
  44.   
  45. }  

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


客户端:


MainActivity.java

  1. package org.xiazdong.personlist;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.net.HttpURLConnection;  
  7. import java.net.URL;  
  8. import java.util.ArrayList;  
  9. import java.util.HashMap;  
  10. import java.util.List;  
  11. import java.util.Map;  
  12.   
  13. import org.json.JSONArray;  
  14. import org.json.JSONObject;  
  15. import org.xiazdong.domain.Person;  
  16. import org.xmlpull.v1.XmlPullParser;  
  17.   
  18. import android.app.Activity;  
  19. import android.os.Bundle;  
  20. import android.util.Log;  
  21. import android.util.Xml;  
  22. import android.widget.ListView;  
  23. import android.widget.SimpleAdapter;  
  24.   
  25. public class MainActivity extends Activity {  
  26.     private ListView listView;  
  27.   
  28.     @Override  
  29.     public void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.main);  
  32.         listView = (ListView) this.findViewById(R.id.listview);  
  33.         List<Person> persons = null;  
  34.         try {  
  35.             persons = getJSONData();  
  36.         } catch (Exception e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.         List<Map<String, Object>> maps = new ArrayList<Map<String, Object>>();  
  40.         for (Person person : persons) {  
  41.             HashMap<String, Object> map = new HashMap<String, Object>();  
  42.             map.put("id", person.getId());  
  43.             map.put("name", person.getName());  
  44.             map.put("age", person.getAge());  
  45.             maps.add(map);  
  46.         }  
  47.         SimpleAdapter adapter = new SimpleAdapter(this, maps, R.layout.item,  
  48.                 new String[] { "id""name""age" }, new int[] { R.id.id,  
  49.                         R.id.name, R.id.age });  
  50.         listView.setAdapter(adapter);  
  51.     }  
  52.   
  53.     //读取JSON数据并转为List<Person>   
  54.     private List<Person> getJSONData() throws Exception {  
  55.         List<Person> persons = new ArrayList<Person>();  
  56.         URL url = new URL("http://192.168.0.103:8080/Server/ListServlet");  
  57.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  58.         conn.setRequestMethod("GET");  
  59.         if (conn.getResponseCode() == 200) {  
  60.             InputStream in = conn.getInputStream();  
  61.             persons = parseJSON(in);  
  62.         }  
  63.         return persons;  
  64.   
  65.     }  
  66.     private List<Person> parseJSON(InputStream in)throws Exception{  
  67.         List<Person> persons = new ArrayList<Person>();  
  68.         Person person = null;  
  69.         String str = read(in);  
  70.         JSONArray array = new JSONArray(str);  
  71.         int length = array.length();  
  72.         for(int i=0;i<length;i++){  
  73.             JSONObject object = array.getJSONObject(i);  
  74.             person = new Person(object.getInt("id"), object.getString("name"), object.getInt("age"));  
  75.             persons.add(person);  
  76.         }  
  77.         return persons;  
  78.     }  
  79.     private String read(InputStream in) throws IOException {  
  80.         byte[] data;  
  81.         ByteArrayOutputStream bout = new ByteArrayOutputStream();  
  82.         byte[]buf = new byte[1024];  
  83.         int len = 0;  
  84.         while((len = in.read(buf))!=-1){  
  85.             bout.write(buf, 0, len);  
  86.         }  
  87.         data = bout.toByteArray();  
  88.         return new String(data,"UTF-8");  
  89.     }  
  90. }  

总结:

JSON和XML都是数据传输的两种格式;

相关内容