声明:
1、本帖只提供代码,不深入讲解原理。如果读者想要深入了解,那就不要在这个帖子上浪费时间了2、客户端用的是Google官方的Volley访问服务器,具体了解Volley请戳 3、本帖三种数据解析的DEMO都用到了下面这个Person类,贴出来:1 public class Person { 2 private String name; 3 private int age; 4 private String address; 5 6 public Person() { 7 8 } 9 10 public Person(String name, int age, String address) {11 super();12 this.name = name;13 this.age = age;14 this.address = address;15 }16 17 public String getName() {18 return name;19 }20 21 public void setName(String name) {22 this.name = name;23 }24 25 public int getAge() {26 return age;27 }28 29 public void setAge(int age) {30 this.age = age;31 }32 33 public String getAddress() {34 return address;35 }36 37 public void setAddress(String address) {38 this.address = address;39 }40 }
一、JSON的封装和解析
服务端 的代码如下:
在MyEclipse中新建一个Web Project,把JSON操作所需要的JAR包()导入到项目中。
1 public class JsonTools {2 // 封装JSON字符串3 public static String createJsonString(String key, Object value) {4 JSONObject jsonObject = new JSONObject();5 jsonObject.put(key, value);6 return jsonObject.toString();7 }8 }
1 public class JsonService { 2 public Person getPerson() { 3 return new Person("张三", 20, "北京"); 4 } 5 6 public ListgetPersons() { 7 List list = new ArrayList (); 8 list.add(new Person("张三", 20, "北京")); 9 list.add(new Person("李四", 22, "上海"));10 list.add(new Person("王五", 21, "天津"));11 return list;12 }13 14 public List getStrings() {15 List list = new ArrayList ();16 list.add("星期一");17 list.add("星期二");18 list.add("星期三");19 list.add("星期四");20 list.add("星期五");21 return list;22 }23 24 public List
1 public class JsonServlet extends HttpServlet { 2 private JsonService service; 3 4 public JsonServlet() { 5 super(); 6 } 7 8 public void destroy() { 9 super.destroy();10 }11 12 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {13 response.setContentType("text/html;charset=UTF-8");14 request.setCharacterEncoding("UTF-8");15 response.setCharacterEncoding("UTF-8");16 PrintWriter out = response.getWriter();17 18 String key = request.getParameter("key");19 if (key.equals("person")) {20 Person person = service.getPerson();21 out.println(JsonTools.createJsonString("person", person));22 } else if (key.equals("persons")) {23 Listpersons = service.getPersons();24 out.println(JsonTools.createJsonString("persons", persons));25 } else if (key.equals("strings")) {26 List strings = service.getStrings();27 out.println(JsonTools.createJsonString("strings", strings));28 } else if (key.equals("maps")) {29 List > maps = service.getMaps();30 out.println(JsonTools.createJsonString("maps", maps));31 }32 }33 34 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {35 doGet(request, response);36 }37 38 public void init() throws ServletException {39 service = new JsonService();40 }41 }
对于输入的URL不同,结果如下:
客户端 的代码如下:
在解析JSON时,客户端不需要导入任何包。
16 7 13 14 22 23 31 32 40 41
1 public class JsonTools { 2 public void getResult(TextView view, JSONObject jsonObject) { 3 switch (view.getId()) { 4 case R.id.person_result: 5 view.setText(getPerson(jsonObject)); 6 break; 7 case R.id.persons_result: 8 view.setText(getPersons(jsonObject)); 9 break;10 case R.id.strings_result:11 view.setText(getStrings(jsonObject));12 break;13 case R.id.maps_result:14 view.setText(getMaps(jsonObject));15 break;16 }17 }18 19 private String getPerson(JSONObject jsonObject) {20 String result = "-->从服务器获取Person数据\n";21 try {22 JSONObject personObject = jsonObject.getJSONObject("person");23 result += "姓名:" + personObject.getString("name") + "\n";24 result += "年龄:" + personObject.getString("age") + "\n";25 result += "地址:" + personObject.getString("address");26 } catch (JSONException e) {27 e.printStackTrace();28 }29 return result;30 }31 32 private String getPersons(JSONObject jsonObject) {33 String result = "-->从服务器获取List数据\n";34 try {35 JSONArray jsonArray = jsonObject.getJSONArray("persons");36 for (int i = 0; i < jsonArray.length(); i++) {37 result += "-第" + (i + 1) + "组数据:\n";38 JSONObject subObject = jsonArray.getJSONObject(i);39 result += "姓名:" + subObject.getString("name") + "\n";40 result += "年龄:" + subObject.getString("age") + "\n";41 result += "地址:" + subObject.getString("address");42 if (i != jsonArray.length() - 1) {43 result += "\n";44 }45 }46 } catch (JSONException e) {47 e.printStackTrace();48 }49 return result;50 }51 52 private String getStrings(JSONObject jsonObject) {53 String result = "-->从服务器获取List 数据\n";54 try {55 JSONArray jsonArray = jsonObject.getJSONArray("strings");56 for (int i = 0; i < jsonArray.length(); i++) {57 result += jsonArray.getString(i);58 if (i != jsonArray.length() - 1) {59 result += " -> ";60 }61 }62 } catch (JSONException e) {63 e.printStackTrace();64 }65 return result;66 }67 68 private String getMaps(JSONObject jsonObject) {69 String result = "-->从服务器获取List >数据\n";70 try {71 JSONArray jsonArray = jsonObject.getJSONArray("maps");72 for (int i = 0; i < jsonArray.length(); i++) {73 result += "-第" + (i + 1) + "组数据:\n";74 JSONObject subObject = jsonArray.getJSONObject(i);75 result += "姓名:" + subObject.getString("name") + "\n";76 result += "电话:" + subObject.getString("phone") + "\n";77 result += "地址:" + subObject.getString("address");78 if (i != jsonArray.length() - 1) {79 result += "\n";80 }81 }82 } catch (JSONException e) {83 e.printStackTrace();84 }85 return result;86 }87 }
1 public class MainActivity extends Activity { 2 private final String url = "http://192.168.1.102:8080/JsonServer/JsonServlet"; 3 private TextView person_result, persons_result, strings_result, maps_result; 4 private JsonTools jsonTools; 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main);10 person_result = (TextView) findViewById(R.id.person_result);11 persons_result = (TextView) findViewById(R.id.persons_result);12 strings_result = (TextView) findViewById(R.id.strings_result);13 maps_result = (TextView) findViewById(R.id.maps_result);14 jsonTools = new JsonTools();15 16 getResponseToView(url + "?key=person", "json_person", person_result);17 getResponseToView(url + "?key=persons", "json_persons", persons_result);18 getResponseToView(url + "?key=strings", "json_strings", strings_result);19 getResponseToView(url + "?key=maps", "json_maps", maps_result);20 }21 22 private void getResponseToView(String url, String tag, final TextView view) {23 StringRequest request = new StringRequest(Method.GET, url, new Listener() {24 @Override25 public void onResponse(String response) {26 try {27 JSONObject resultObject = new JSONObject(response);28 jsonTools.getResult(view, resultObject);29 } catch (JSONException e) {30 e.printStackTrace();31 }32 }33 }, new Response.ErrorListener() {34 @Override35 public void onErrorResponse(VolleyError arg0) {36 view.setText(arg0.toString());37 }38 });39 request.setTag(tag);40 MyApplication.getRequestQueue().add(request);41 }42 43 @Override44 protected void onStop() {45 super.onStop();46 MyApplication.getRequestQueue().cancelAll("JsonRequest");47 }48 }
运行结果如下图所示:
二、GSON的封装和解析
服务端 的代码如下(生成数据的类GsonService和JsonService类相同,这里就不再贴了):
在MyEclipse中新建一个Web Project,将GSON操作所需要的JAR包()导入到项目中。
1 public class GsonTools {2 // 生成GSON字符串3 public static String createGsonString(Object value) {4 Gson gson = new Gson();5 String gsonString = gson.toJson(value);6 return gsonString;7 }8 }
1 public class GsonServlet extends HttpServlet { 2 private GsonService service; 3 4 public GsonServlet() { 5 super(); 6 } 7 8 public void destroy() { 9 super.destroy();10 }11 12 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {13 response.setContentType("text/html;charset=UTF-8");14 request.setCharacterEncoding("UTF-8");15 response.setCharacterEncoding("UTF-8");16 PrintWriter out = response.getWriter();17 18 String key = request.getParameter("key");19 if (key.equals("person")) {20 Person person = service.getPerson();21 out.println(GsonTools.createGsonString(person));22 } else if (key.equals("persons")) {23 Listpersons = service.getPersons();24 out.println(GsonTools.createGsonString(persons));25 } else if (key.equals("strings")) {26 List strings = service.getStrings();27 out.println(GsonTools.createGsonString(strings));28 } else if (key.equals("maps")) {29 List > maps = service.getMaps();30 out.println(GsonTools.createGsonString(maps));31 }32 }33 34 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {35 doGet(request, response);36 }37 38 public void init() throws ServletException {39 service = new GsonService();40 }41 }
对于输入的URL不同,结果如下:
客户端 的代码如下(MainActivity类的布局代码和上面的一样):
在解析GSON时,客户端需要导入和服务端相同的包。
1 public class GsonTools { 2 public staticT getPerson(String jsonString, Class cls) { 3 T t = null; 4 try { 5 Gson gson = new Gson(); 6 t = gson.fromJson(jsonString, cls); 7 } catch (Exception e) { 8 e.printStackTrace(); 9 }10 return t;11 }12 13 public static List getPersons(String jsonString, Class cls) {14 List list = null;15 try {16 Gson gson = new Gson();17 list = Arrays.asList(gson.fromJson(jsonString, cls));18 } catch (Exception e) {19 e.printStackTrace();20 }21 return list;22 }23 24 public static List getStrings(String jsonString) {25 List list = null;26 try {27 Gson gson = new Gson();28 list = gson.fromJson(jsonString, new TypeToken
>() {29 }.getType());30 } catch (Exception e) {31 e.printStackTrace();32 }33 return list;34 }35 36 public static List > getMaps(String jsonString,Class cls) {37 List > list = new ArrayList >();38 try {39 Gson gson = new Gson();40 list = gson.fromJson(jsonString, new TypeToken
>>() {41 }.getType());42 } catch (Exception e) {43 e.printStackTrace();44 }45 return list;46 }47 }
1 public class MainActivity extends Activity { 2 private final String url = "http://192.168.1.102:8080/GsonServer/GsonServlet"; 3 private TextView person_result, persons_result, strings_result, maps_result; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 person_result = (TextView) findViewById(R.id.person_result);10 persons_result = (TextView) findViewById(R.id.persons_result);11 strings_result = (TextView) findViewById(R.id.strings_result);12 maps_result = (TextView) findViewById(R.id.maps_result);13 14 getResultToView(url + "?key=person", "GsonPerson", person_result);15 getResultToView(url + "?key=persons", "GsonPersons", persons_result);16 getResultToView(url + "?key=strings", "GsonStrings", strings_result);17 getResultToView(url + "?key=maps", "GsonMaps", maps_result);18 }19 20 private void getResultToView(String url, String tag, final TextView view) {21 StringRequest request = new StringRequest(Method.GET, url, new Listener() {22 @Override23 public void onResponse(String response) {24 manageResponse(response, view);25 }26 }, new ErrorListener() {27 @Override28 public void onErrorResponse(VolleyError arg0) {29 view.setText(arg0.toString());30 }31 });32 request.setTag(tag);33 MyApplication.getRequestQueue().add(request);34 }35 36 // 将GsonTools类返回的处理好的JAVA对象进行排版并输出到对应TextView中37 private void manageResponse(String response, TextView view) {38 switch (view.getId()) {39 case R.id.person_result:40 addTextToView(view, "-->从服务器获取Person数据\n");41 Person person = GsonTools.getPerson(response, Person.class);42 addTextToView(view, "姓名:" + person.getName() + "\n年龄:" + person.getAge() + "\n地址:" + person.getAddress());43 break;44 case R.id.persons_result:45 addTextToView(view, "-->从服务器获取List 数据\n");46 List persons = GsonTools.getPersons(response, Person[].class);47 for (int i = 0; i < persons.size(); i++) {48 Person p = persons.get(i);49 addTextToView(view, "-第" + (i + 1) + "条数据\n");50 addTextToView(view, "姓名:" + p.getName() + "\n年龄:" + p.getAge() + "\n地址:" + p.getAddress());51 if (i != persons.size() - 1) {52 addTextToView(view, "\n");53 }54 }55 break;56 case R.id.strings_result:57 addTextToView(view, "-->从服务器获取List 数据\n");58 List strings = GsonTools.getStrings(response);59 for (int i = 0; i < strings.size(); i++) {60 addTextToView(view, strings.get(i));61 if (i != strings.size() - 1) {62 addTextToView(view, " -> ");63 }64 }65 break;66 case R.id.maps_result:67 addTextToView(view, "-->从服务器获取List >数据\n");68 List > maps = GsonTools.getMaps(response, String.class);69 for (int i = 0; i < maps.size(); i++) {70 addTextToView(view, "-第" + (i + 1) + "条数据:\n");71 addTextToView(view, "姓名:" + maps.get(i).get("name").toString() + "\n");72 addTextToView(view, "电话:" + maps.get(i).get("phone").toString() + "\n");73 addTextToView(view, "地址:" + maps.get(i).get("address").toString());74 if (i != maps.size() - 1) {75 addTextToView(view, "\n");76 }77 }78 break;79 }80 }81 82 // 向指定TextView中添加文本83 private void addTextToView(TextView view, String text) {84 String currentText = view.getText().toString();85 currentText += text;86 view.setText(currentText);87 }88 89 @Override90 protected void onStop() {91 super.onStop();92 MyApplication.getRequestQueue().cancelAll("GsonPerson");93 MyApplication.getRequestQueue().cancelAll("GsonPersons");94 MyApplication.getRequestQueue().cancelAll("GsonStrings");95 MyApplication.getRequestQueue().cancelAll("GsonMaps"); }96 }
运行结果如下图:
三、FastJSON的封装和解析
服务端 的代码和使用GSON解析时的服务端代码相同(不需要改变任何东西,包括JAR包)。
客户端 的代码如下:
在解析FastJSON时,客户端需要导入解析FastJSON所需要的JAR包()。
1 public class FastJsonTools { 2 public staticT getPerson(String jsonString, Class cls) { 3 T t = null; 4 try { 5 t = JSON.parseObject(jsonString, cls); 6 } catch (Exception e) { 7 e.printStackTrace(); 8 } 9 return t;10 }11 12 // 解析List 数据和List 数据都使用这个方法13 public static List getPersons(String jsonString, Class cls) {14 List list = null;15 try {16 list = JSON.parseArray(jsonString, cls);17 } catch (Exception e) {18 e.printStackTrace();19 }20 return list;21 }22 23 public static List > getMaps(String jsonString) {24 List > maps = new ArrayList >();25 try {26 maps = JSON.parseObject(jsonString, new TypeReference
>>() {27 });28 } catch (Exception e) {29 e.printStackTrace();30 }31 return maps;32 }33 }
1 public class MainActivity extends Activity { 2 private final String url = "http://192.168.1.102:8080/GsonServer/GsonServlet"; 3 private TextView person_result, persons_result, strings_result, maps_result; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 person_result = (TextView) findViewById(R.id.person_result);10 persons_result = (TextView) findViewById(R.id.persons_result);11 strings_result = (TextView) findViewById(R.id.strings_result);12 maps_result = (TextView) findViewById(R.id.maps_result);13 14 getResultToView(url + "?key=person", "FastJsonPerson", person_result);15 getResultToView(url + "?key=persons", "FastJsonPersons", persons_result);16 getResultToView(url + "?key=strings", "FastJsonStrings", strings_result);17 getResultToView(url + "?key=maps", "FastJsonMaps", maps_result);18 }19 20 private void getResultToView(String url, String tag, final TextView view) {21 StringRequest request = new StringRequest(Method.GET, url, new Listener() {22 @Override23 public void onResponse(String response) {24 manageResponse(view, response);25 }26 }, new Response.ErrorListener() {27 @Override28 public void onErrorResponse(VolleyError arg0) {29 addTextToView(view, arg0.toString());30 }31 });32 request.setTag(tag);33 MyApplication.getRequestQueue().add(request);34 }35 36 private void addTextToView(TextView view, String text) {37 String currentText = view.getText().toString();38 currentText += text;39 view.setText(currentText);40 }41 42 private void manageResponse(TextView view, String response) {43 switch (view.getId()) {44 case R.id.person_result:45 addTextToView(view, "-->从服务端获取Person数据\n");46 Person person = FastJsonTools.getPerson(response, Person.class);47 addTextToView(view,48 "姓名:" + person.getName() + "\n年龄:" + person.getAddress() + "\n地址:" + person.getAddress());49 break;50 case R.id.persons_result:51 addTextToView(view, "-->从服务器获取List 数据\n");52 List persons = FastJsonTools.getPersons(response, Person.class);53 for (int i = 0; i < persons.size(); i++) {54 Person p = persons.get(i);55 addTextToView(view, "-第" + (i + 1) + "条数据\n");56 addTextToView(view, "姓名:" + p.getName() + "\n年龄:" + p.getAge() + "\n地址:" + p.getAddress());57 if (i != persons.size() - 1) {58 addTextToView(view, "\n");59 }60 }61 break;62 case R.id.strings_result:63 addTextToView(view, "-->从服务器获取List 数据\n");64 List strings = FastJsonTools.getPersons(response, String.class);65 for (int i = 0; i < strings.size(); i++) {66 addTextToView(view, strings.get(i));67 if (i != strings.size() - 1) {68 addTextToView(view, " -> ");69 }70 }71 break;72 case R.id.maps_result:73 addTextToView(view, "-->从服务器获取List >数据\n");74 List > maps = FastJsonTools.getMaps(response);75 for (int i = 0; i < maps.size(); i++) {76 addTextToView(view, "-第" + (i + 1) + "条数据:\n");77 addTextToView(view, "姓名:" + maps.get(i).get("name").toString() + "\n");78 addTextToView(view, "电话:" + maps.get(i).get("phone").toString() + "\n");79 addTextToView(view, "地址:" + maps.get(i).get("address").toString());80 if (i != maps.size() - 1) {81 addTextToView(view, "\n");82 }83 }84 break;85 }86 }87 88 @Override89 protected void onStop() {90 super.onStop();91 MyApplication.getRequestQueue().cancelAll("FastJsonPerson");92 MyApplication.getRequestQueue().cancelAll("FastJsonPersons");93 MyApplication.getRequestQueue().cancelAll("FastJsonStrings");94 MyApplication.getRequestQueue().cancelAll("FastJsonMaps");95 }96 }
运行结果如下图: