服务器端的工作就是将特定的数据类型转换为json字符串,然后客户端再将json字符串转换成原来的类型,所以json解析是跨平台数据格式转换的一个桥梁,
这里以最常用的对象类型,list包裹对象类型,list包裹String类型,以及list包裹Map对象类型4种情况为例简单介绍json的数据解析
服务器端json所用到的jar包下载(免积分) 服务器端源码下载(免积分) (由于安卓巴士屏蔽站外链接,所以暂不提供下载链接了)
一、首先服务器端将数据转换为json格式
1,首先建立一个Person对象类,后面就是将person对象转换为json格式
[java] view plain copy
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
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
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
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
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
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数据
如果,您希望更容易地发现我的新博客,不妨点击一下【加关注】。