登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

Android客户端与服务器端交互数据之json解析 [复制链接]

2016-8-2 12:41
zml_2015 阅读:1654 评论:3 赞:0
Tag:  json解析json解析

服务器端的工作就是将特定的数据类型转换为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!

分享到:
我来说两句
facelist
您需要登录后才可以评论 登录 | 立即注册
所有评论(3)
tianxiacode 2016-8-3 06:40
回个帖  攒攒经验
回复
zml_2015 2016-8-3 10:36
tianxiacode: 回个帖  攒攒经验
  
回复
java_xml 2016-9-20 11:56
  
回复

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

返回顶部