继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Android客户端与服务器端交互数据之json解析

饮歌长啸
关注TA
已关注
手记 188
粉丝 46
获赞 152

服务器端的工作就是将特定的数据类型转换为json字符串,然后客户端再将json字符串转换成原来的类型,所以json解析是跨平台数据格式转换的一个桥梁,

这里以最常用的对象类型,list包裹对象类型,list包裹String类型,以及list包裹Map对象类型4种情况为例简单介绍json的数据解析

服务器端json所用到的jar包下载(免积分)  服务器端源码下载(免积分) (由于安卓巴士屏蔽站外链接,所以暂不提供下载链接了

一、首先服务器端将数据转换为json格式

1,首先建立一个Person对象类,后面就是将person对象转换为json格式

[java] view plain copy

 说明: 在CODE上查看代码片

1.  package com.zml.pojo;  

2.    

3.  /** 

4.   * @author 郑明亮 

5.   * @Time:2016年2月2日 下午10:35:05 

6.   * @version 1.0 

7.   */  

8.  public class Person {  

9.    

10.     String name;  

11.     String sex;  

12.     String QQ;  

13.     String contact;  

14.   

15.     public Person() {  

16.         // TODO Auto-generated constructor stub  

17.     }  

18.   

19.     public Person(String name, String sex, String qQ, String contact) {  

20.         super();  

21.         this.name = name;  

22.         this.sex = sex;  

23.         QQ = qQ;  

24.         this.contact = contact;  

25.     }  

26.   

27.     /** 

28.      * @return the name 

29.      */  

30.     public String getName() {  

31.         return name;  

32.     }  

33.   

34.     /** 

35.      * @param name 

36.      *            the name to set 

37.      */  

38.     public void setName(String name) {  

39.         this.name = name;  

40.     }  

41.   

42.     /** 

43.      * @return the sex 

44.      */  

45.     public String getSex() {  

46.         return sex;  

47.     }  

48.   

49.     /** 

50.      * @param sex 

51.      *            the sex to set 

52.      */  

53.     public void setSex(String sex) {  

54.         this.sex = sex;  

55.     }  

56.   

57.     /** 

58.      * @return the qQ 

59.      */  

60.     public String getQQ() {  

61.         return QQ;  

62.     }  

63.   

64.     /** 

65.      * @param qQ 

66.      *            the qQ to set 

67.      */  

68.     public void setQQ(String qQ) {  

69.         QQ = qQ;  

70.     }  

71.   

72.     /** 

73.      * @return the contact 

74.      */  

75.     public String getContact() {  

76.         return contact;  

77.     }  

78.   

79.     /** 

80.      * @param contact 

81.      *            the contact to set 

82.      */  

83.     public void setContact(String contact) {  

84.         this.contact = contact;  

85.     }  

86.   

87.     /* 

88.      * (non-Javadoc) 

89.      *  

90.      * @see java.lang.Object#toString() 

91.      */  

92.     @Override  

93.     public String toString() {  

94.         return "Person [name=" + name + ", sex=" + sex + ", QQ=" + QQ  

95.                 + ", contact=" + contact + "]";  

96.     }  

97.   

98. }  


 

2.我写了一个工具类,用来生成上述的四种类型的数据;

[java] view plain copy

 说明: 在CODE上查看代码片

1.  package com.zml.utils;  

2.    

3.  import java.util.ArrayList;  

4.  import java.util.HashMap;  

5.  import java.util.List;  

6.  import java.util.Map;  

7.    

8.  import com.zml.pojo.Person;  

9.    

10. /** 

11.  * 用于生成四种类型的数据来测试json解析: 

12.  * ①Person对象类型 ②List<Person> ③List<String> ④List<Map<String,Object>> 

13.  *  

14.  * @author 郑明亮 

15.  * @Time:2016年2月2日 下午10:38:40 

16.  * @version 1.0 

17.  */  

18. public class DataUtil {  

19.   

20.     public static Person getPerson() {  

21.   

22.         return new Person("郑明亮", "男", "1072307340", "15733100573");  

23.     }  

24.   

25.     public static List<Person> getPersons() {  

26.         List<Person> list = new ArrayList<Person>();  

27.         list.add(getPerson());  

28.         list.add(new Person("张三", "男", "123456789", "98765432"));  

29.         list.add(new Person("李四", "女", "762348234", "12312124324"));  

30.         return list;  

31.   

32.     }  

33.       

34.     public static List<String>    getStrings(){  

35.         List<String>list = new ArrayList<String>();  

36.         list.add("郑明亮");  

37.         list.add("张三");  

38.         list.add("李四");  

39.           

40.         return list;  

41.     }  

42.       

43.     public static List<Map<String,Object>> getMaps(){  

44.           

45.         List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();  

46.         Map<String,Object> map = new HashMap<String, Object>();  

47.         map.put("name","郑明亮" );  

48.         map.put("blog", "blog.csdn.net/zml_2015");  

49.         map.put("person", getPerson());  

50.         list.add(map);  

51.         return list;  

52.           

53.     }  

54.   

55. }  


3.接下来就是写json数据类型的转换类了

[java] view plain copy

 说明: 在CODE上查看代码片

1.  package com.zml.utils;  

2.    

3.  import net.sf.json.JSONObject;  

4.    

5.  /** 

6.   * @author 郑明亮 

7.   * @Time:2016年2月2日 上午12:18:38 

8.   * @version 1.0 

9.   */  

10. public class JsonTools {  

11.       

12.       

13.     public static String  createJsonString(String key,Object value){  

14.           

15.         JSONObject jsonObject=new JSONObject();  

16.         jsonObject.put(key, value);  

17.         return jsonObject.toString();  

18.           

19.         }  

20.       

21. }  


 

4.进行测试,看是否将上述4种数据转换为了json的数据类型

 

[java] view plain copy

 说明: 在CODE上查看代码片

1.  package com.zml.test;  

2.    

3.  import com.zml.utils.DataUtil;  

4.  import com.zml.utils.JsonTools;  

5.    

6.  /** 

7.   * @author 郑明亮 

8.   * @Time:2016年2月2日 上午12:27:29 

9.   * @version 1.0 

10.  */  

11. public class testjson {  

12.   

13.     public static void main(String[] args) {  

14.             String jsonString;  

15.             jsonString = JsonTools.createJsonString("person",DataUtil.getPerson());  

16.   

17.             System.out.println(jsonString);           

18.             jsonString = JsonTools.createJsonString("persons",DataUtil.getPersons());  

19.   

20.             System.out.println(jsonString);           

21.             jsonString = JsonTools.createJsonString("strings",DataUtil.getStrings());  

22.   

23.             System.out.println(jsonString);       

24.             jsonString = JsonTools.createJsonString("maps",DataUtil.getMaps());  

25.             System.out.println(jsonString);       

26.         }  

27.           

28.       

29.   

30. }  


5.测试成功后,建立Servlet类,以方便将json数据传输给客户端

[java] view plain copy

 说明: 在CODE上查看代码片

1.  <p>package com.zml.test;</p><p>import java.io.IOException;  

2.  import java.io.PrintWriter;</p><p>import javax.servlet.ServletException;  

3.  import javax.servlet.http.HttpServlet;  

4.  import javax.servlet.http.HttpServletRequest;  

5.  import javax.servlet.http.HttpServletResponse;</p><p>import com.zml.utils.DataUtil;  

6.  import com.zml.utils.JsonTools;</p><p>/** 

7.   * @author 郑明亮 

8.   * @Time:2016年2月2日 下午10:54:26 

9.   * @version 1.0 

10.  */  

11. public class JsonServlet extends HttpServlet {</p><p> /** 

12.   * Constructor of the object. 

13.   */  

14.  public JsonServlet() {  

15.   super();  

16.  }</p><p> /** 

17.   * Destruction of the servlet. <br> 

18.   */  

19.  public void destroy() {  

20.   super.destroy(); // Just puts "destroy" string in log  

21.   // Put your code here  

22.  }</p><p> /** 

23.   * The doGet method of the servlet. <br> 

24.   *  

25.   * This method is called when a form has its tag value method equals to get. 

26.   *  

27.   * @param request 

28.   *            the request send by the client to the server 

29.   * @param response 

30.   *            the response send by the server to the client 

31.   * @throws ServletException 

32.   *             if an error occurred 

33.   * @throws IOException 

34.   *             if an error occurred 

35.   */  

36.  public void doGet(HttpServletRequest request, HttpServletResponse response)  

37.    throws ServletException, IOException {  

38.   this.doPost(request, response);</p><p> }</p><p> /** 

39.   * The doPost method of the servlet. <br> 

40.   *  

41.   * This method is called when a form has its tag value method equals to 

42.   * post. 

43.   *  

44.   * @param request 

45.   *            the request send by the client to the server 

46.   * @param response 

47.   *            the response send by the server to the client 

48.   * @throws ServletException 

49.   *             if an error occurred 

50.   * @throws IOException 

51.   *             if an error occurred 

52.   */  

53.  public void doPost(HttpServletRequest request, HttpServletResponse response)  

54.    throws ServletException, IOException {</p><p>  response.setContentType("text/html;charset=utf-8");  

55.   request.setCharacterEncoding("utf-8");  

56.   response.setCharacterEncoding("utf-8");  

57.   PrintWriter out = response.getWriter();</p><p>  String jsonString="";  

58.   String  actionString = request.getParameter("action");  

59.     

60.   if (actionString.equals("person")) {  

61.      

62.    jsonString = JsonTools.createJsonString("person",DataUtil.getPerson());</p><p>  } else if (actionString.equals("persons")) {  

63.      

64.    jsonString = JsonTools.createJsonString("persons",DataUtil.getPersons());</p><p>  } else if (actionString.equals("strings")) {  

65.      

66.    jsonString = JsonTools.createJsonString("strings",DataUtil.getStrings());</p><p>  } else if (actionString.equals("maps")) {  

67.      

68.    jsonString = JsonTools.createJsonString("maps",DataUtil.getMaps());  

69.      

70.   }  

71.     

72.   out.write(jsonString);</p><p> }</p><p> /** 

73.   * Initialization of the servlet. <br> 

74.   *  

75.   * @throws ServletException 

76.   *             if an error occurs 

77.   */  

78.  public void init() throws ServletException {  

79.   // Put your code here  

80.  }</p><p>}  

81. </p>  


 通过网址访问可得到的JSON数据:





二、客户端解析json数据

这里暂时只贴出重要的解析部分,

[java] view plain copy

 说明: 在CODE上查看代码片

1.  package com.zml.util;  

2.    

3.  import java.util.ArrayList;  

4.  import java.util.HashMap;  

5.  import java.util.Iterator;  

6.  import java.util.List;  

7.  import java.util.Map;  

8.    

9.  import org.json.JSONArray;  

10. import org.json.JSONException;  

11. import org.json.JSONObject;  

12.   

13. import com.zml.pojo.Person;  

14.   

15. /** 

16.  * 解析数据:将json字符串解析还原成原来的数据类型 

17.  *  

18.  * @author 郑明亮 

19.  * @date 2016-2-3 上午12:11:57 

20.  * @version 1.0 

21.  */  

22. public class JsonTools {  

23.   

24.     public static Person getPerson(String key, String jsonString) {  

25.         Person person = new Person();  

26.         // 将json字符串转换成json对象  

27.         try {  

28.             JSONObject jsonObject = new JSONObject(jsonString);  

29.             // 将json对象根据key(person),拿到对应的value(Person对象)值  

30.             JSONObject jsonObject2 = jsonObject.getJSONObject(key);  

31.             // 将拿到的对象set到一个person对象中  

32.             person.setName(jsonObject2.getString("name"));  

33.             person.setSex(jsonObject2.getString("sex"));  

34.             person.setQQ(jsonObject2.getString("QQ"));  

35.             person.setContact(jsonObject2.getString("contact"));  

36.         } catch (JSONException e) {  

37.             // TODO Auto-generated catch block  

38.             e.printStackTrace();  

39.         }  

40.         return person;  

41.   

42.     }  

43.   

44.     public static List<Person> getPersons(String key, String jsonString) {  

45.         List<Person> list = new ArrayList<Person>();  

46.         JSONObject jsonObject;  

47.         try {  

48.             jsonObject = new JSONObject(jsonString);  

49.             JSONArray Persons = jsonObject.getJSONArray(key);  

50.             for (int i = 0; i < Persons.length(); i++) {  

51.                 Person person = new Person();  

52.                 JSONObject jsonObject2 = Persons.getJSONObject(i);  

53.                 person.setName(jsonObject2.getString("name"));  

54.                 person.setSex(jsonObject2.getString("sex"));  

55.                 person.setQQ(jsonObject2.getString("QQ"));  

56.                 person.setContact(jsonObject2.getString("contact"));  

57.   

58.                 list.add(person);  

59.             }  

60.         } catch (JSONException e) {  

61.             // TODO Auto-generated catch block  

62.             e.printStackTrace();  

63.         }  

64.   

65.         return list;  

66.     }  

67.   

68.     public static List<String> getStrings(String key, String jsonString) {  

69.         List<String> list = new ArrayList<String>();  

70.   

71.         try {  

72.             JSONObject jsonObject = new JSONObject(jsonString);  

73.             JSONArray StringArray = jsonObject.getJSONArray(key);  

74.             for (int i = 0; i < StringArray.length(); i++) {  

75.                 String str = StringArray.getString(i);  

76.                 list.add(str);  

77.   

78.             }  

79.   

80.         } catch (Exception e) {  

81.             // TODO: handle exception  

82.         }  

83.   

84.         return list;  

85.   

86.     }  

87.   

88.     public static List<Map<String, Object>> getMaps(String key,  

89.             String jsonString) {  

90.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  

91.   

92.         try {  

93.             JSONObject jsonObject = new JSONObject(jsonString);  

94.             JSONArray mapsArray = jsonObject.getJSONArray(key);  

95.             for (int i = 0; i < mapsArray.length(); i++) {  

96.                 JSONObject jsonObject2 = mapsArray.getJSONObject(i);  

97.                 Map<String, Object> map = new HashMap<String, Object>();  

98.                 // 查看Map中的键值对的key值  

99.                 Iterator<String> iterator = jsonObject2.keys();  

100.   

101.                 while (iterator.hasNext()) {  

102.                     String json_key = iterator.next();  

103.                     Object json_value = jsonObject2.get(json_key);  

104.                     if(json_value==null){  

105.                         //当键值对中的value为空值时,将value置为空字符串;  

106.                         json_value="";  

107.                     }  

108.                     map.put(json_key, json_value);  

109.                 }  

110.                 list.add(map);  

111.             }  

112.         } catch (Exception e) {  

113.             // TODO: handle exception  

114.         }  

115.         return list;  

116.     }  

117.   

118. }  


需要注意的是上述,客户端和服务器端虽然都用到了JSONObject类,但是引用的不是一个jar包中的内容哦;客户端的是引用的 org.json.JSONObject;而服务器端引用的是net.sf.json.JSONObject;

 

 

关于Gson解析请移步到这 Andorid之Gson解析Json数据

 

如果,您认为这篇博客让您有些收获,不妨点击一下【顶】。

如果,您希望更容易地发现我的新博客,不妨点击一下【加关注】。

因为,我的热情需要您的肯定和支持。 

感谢您的阅读,如果文章中有错误或者您有什么好的建议,也欢迎您直接留言批评指教。Thanks,friends!

原文链接:http://www.apkbus.com/blog-725636-61283.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP